-#This file was created by <kvigor> Wed Oct 4 16:57:26 2000
-#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team
-\lyxformat 2.15
+#LyX 1.1 created this file. For more info see http://www.lyx.org/
+\lyxformat 218
\textclass article
\language english
\inputencoding default
\layout Title
SDCC Compiler User Guide
-\layout Author
+\layout Standard
+
+
+\begin_inset LatexCommand \tableofcontents{}
+
+\end_inset
+
-Sandeep Dutta (sandeep.dutta@usa.net)
\layout Section
Introduction
+\layout Subsection
+
+About SDCC
\layout Standard
-SDCC is a Free ware , retargettable, optimizing ANSI-C compiler.
- The current version targets Intel 8051 based MCUs, including the Dallas
- 80C390 variant, as well as the Zilog Z80 family.
- It can be retargetted for other 8 bit MCUs or PICs.
+
+\series bold
+SDCC
+\series default
+ is a Free ware, retargettable, optimizing ANSI-C compiler by
+\series bold
+Sandeep Dutta
+\series default
+ designed for 8 bit Microprocessors.
+ The current version targets Intel MCS51 based Microprocessors(8051,8052,
+ etc), Zilog Z80 based MCUs, and the Dallas 80C390 MCS51 variant.
+ It can be retargetted for other microprocessors, support for PIC, AVR and
+ 186 is under development.
The entire source code for the compiler is distributed under GPL.
SDCC uses ASXXXX & ASLINK, a Freeware, retargettable assembler & linker.
- SDCC has extensive MCU (8051) specific language extensions, which lets
- it utilize the underlying hardware effectively.
- The front-end (parser) will be enhanced to handle language extensions for
- other MCUs as and when they are targetted.
- In addition to the MCU Specific optimizations SDCC also does a host of
+ SDCC has extensive language extensions suitable for utilizing various microcont
+rollers underlying hardware effectively.
+ In addition to the MCU specific optimizations SDCC also does a host of
standard optimizations like
\emph on
global sub expression elimination, loop optimizations (loop invariant,
\emph default
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.
+ be well suited for other 8 bit MCUs.
+ The peep hole optimizer uses a rule based substitution mechanism which
+ is MCU independent.
Supported data-types are
\emph on
short (8 bits, 1 byte), char (8 bits, 1 byte), int (16 bits, 2 bytes ),
to be embedded anywhere in a function.
In addition routines developed in assembly can also be called.
SDCC also provides an option to report the relative complexity of a function,
- these functions can then be further optimized , or hand coded in assembly
+ these functions can then be further optimized, or hand coded in assembly
if need be.
SDCC also comes with a companion source level debugger SDCDB, the debugger
- currently uses S51 a freeware simulator for 8051, it can be easily modified
- to use other simulators.
+ currently uses ucSim a freeware simulator for 8051 and other micro-controllers.
The latest version can be downloaded from
\series bold
-http://sdcc.sourceforge.net
+
+\begin_inset LatexCommand \htmlurl{http://sdcc.sourceforge.net/}
+
+\end_inset
+
+.
+\layout Subsection
+
+Open Source
\layout Standard
All packages used in this compiler system are
\emph on
opensource
\emph default
- (freeware); source code for all the sub-packages ( asxxxx assembler/linker
- , pre-processor and
-\emph on
- gc
-\emph default
- a conservative garbage collector) are distributed with the package.
- Documentation was created using a freeware word processor (LyX).
+(freeware); source code for all the sub-packages (asxxxx assembler/linker,
+ pre-processor) are distributed with the package.
+ This documentation is maintained using a freeware word processor (LyX).
\layout Standard
You are forbidden to forbid anyone else to use, share and improve what
you give them.
Help stamp out software-hoarding!
-\layout Section
-
-Installation
-\begin_inset LatexCommand \label{Installation}
-
-\end_inset
-
-
-\layout Standard
-
-What you need before you start installation of SDCC ? A C Compiler, not
- just any C Compiler, gcc to be exact, you can get adventurous and try another
- compiler , I HAVEN'T tried it.
- GCC is free , and is available for almost all major platforms.
- If you are using
-\emph on
-linux
-\emph default
- you probably already have it, if you are using
-\emph on
-Windows 9x/NT
-\emph default
- go to
-\emph on
-http://sources.redhat.com/
-\emph default
- and download
-\emph on
-Cygwin.
+\layout Subsection
-\emph default
-
+System Requirements
\layout Standard
-After you have installed
-\emph on
-gcc
-\emph default
- you are ready to build the compiler (sorry no binary distributions yet).
- SDCC is native to Linux but can be ported to any platform on which GCC
- is available .
- Extract the source file package (
-\emph on
-.zip
-\emph default
- or
-\emph on
-.tar.gz
-\emph default
-) into some directory , which we shall refer to as
-\emph on
-SDCCDIR
-\emph default
- from now on.
+What do you need before you start installation of SDCC? A computer, and
+ a desire to compute.
+ The preferred method of installation is to compile SDCC from source using
+ GNU GCC and make.
+ For Windows some pre-compiled binary distributions are available for your
+ convenience.
+ You should have some experience with command line tools and compiler use.
\layout Subsection
-Components of SDCC
-\begin_inset LatexCommand \label{Components}
-
-\end_inset
-
-
-\layout Subsubsection
-
-gc ( a conservative garbage collector)
+Other Resources
\layout Standard
-SDCC relies on this component to do all the memory management, this excellent
- package is copyrighted by
-\emph on
-Jans J Boehm(boehm@sgi.com) and Alan J Demers
-\emph default
- but can be used with minimum restrictions.
- The GC source will be extracted into the directory
-\emph on
-SDCCDIR/gc.
-
-\emph default
-
-\layout Subsubsection
-
-cpp ( C-Preprocessor)
-\layout Standard
+The SDCC home page at
+\begin_inset LatexCommand \htmlurl{http://sdcc.sourceforge.net/}
-The preprocessor is extracted into the directory
-\emph on
-SDCCDIR/cpp
-\emph default
-, it is a modified version of the GNU preprocessor.
-\layout Subsubsection
+\end_inset
-asxxxx & aslink ( The assembler and Linkage Editor)
-\layout Standard
+ is a great place to find distribution sets.
+ You can also find links to the user mailing lists that offer help or discuss
+ SDCC with other SDCC users.
+ Web links to other SDCC related sites can also be found here.
+ This document can be found in the DOC directory of the source package as
+ a text or HTML file.
+ Some of the other tools(simulator and assembler) included with SDCC contain
+ their own documentation and can be found in the source distribution.
+ If you want the latest unreleased software, the complete source package
+ is available directly by anonymous CVS on www.sourceforge.net.
+\layout Section
-This is retargettable assembler & linkage editor, it was developed by Alan
- Baldwin, John Hartman created the version for 8051, and I (Sandeep) have
- some enhancements and bug fixes for it to work properly with the SDCC.
- This component is extracted into the directory
-\emph on
-SDCCDIR/asxxxx.
-\layout Subsubsection
+Installation
+\layout Subsection
-SDCC - The compiler.
-\layout Standard
+Linux/Unix Installation
+\layout Enumerate
-This is the actual compiler, it uses
-\emph on
-gc
-\emph default
- and invokes the assembler and linkage editor.
- All files with the prefix
-\emph on
-SDCC
-\emph default
-are part of the compiler and is extracted into the the directory
-\emph on
-SDCCDIR.
-\layout Subsubsection
-S51 - Simulator
-\layout Standard
+\series medium
+Download the source package, it will be named something like sdcc-2.x.x.tgz.
+\layout Enumerate
-Version 2.1.8 onwards contains s51 a freeware , opensource simulator developed
- by Daniel Drotos <drdani@mazsola.iit.uni-miskolc.hu>.
- The executable is built as part of build process, for more information
- visit Daniel's website at <http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51/
->.
-\layout Subsubsection
-SDCDB - Source level Debugger.
-\layout Standard
+\series medium
+Bring up a command line terminal, such as xterm.
+\layout Enumerate
-SDCDB is the companion source level debugger .
- The current version of the debugger uses Daniel's Simulator S51, but can
- be easily changed to use other simulators.
-\layout Subsection
-Installation for Version <= 2.1.7
-\layout Standard
+\series medium
+Unpack the file using a command like: tar -xzf sdcc-2.x.x.tgz, this will create
+ a sub-directory called sdcc with all of the sources.
+\layout Enumerate
-After the package is extracted (
-\emph on
-Windows 95/NT
-\emph default
- users start
-\emph on
-CYGWIN shell)
-\emph default
-, change to the directory where you extracted the package and give the command.
-\layout Standard
+Change directory into the main SDCC directory, for example type:
+\begin_inset Quotes eld
+\end_inset
-./sdccbuild.sh
-\layout Standard
+cd sdcc
+\begin_inset Quotes erd
+\end_inset
-This is a
-\emph on
-bash
-\emph default
- shell script, it will compile all the above mentioned components and install
- the executables into the directory
-\emph on
-SDCCDIR/bin
-\emph default
- make sure you add this directory to your
-\emph on
-PATH
-\emph default
- environment variable.
- This script will also compile all the support routines ( library routines
- ) using SDCC.
- The support routines are all developed in C and need to be compiled.
-\layout Subsection
+.
+\layout Enumerate
-Installation for Version >= 2.1.8a
-\layout Standard
-The distribution method from Version 2.1.8a has been changed to be conforment
- with the
+\series medium
+Type
\begin_inset Quotes eld
\end_inset
-autoconf
+./configure
\begin_inset Quotes erd
\end_inset
- utility.
- The source is now distributed as
-\series bold
-\size large
-\emph on
-sdcc-<version number>.tar.gz format
+
\series default
-\size default
-\emph default
- , instead of the older .zip format.
- The steps for installation are as follows.
-\layout Subsubsection
+.
+ This configures the package for compilation on your system.
+\layout Enumerate
-Unpack the sources.
-\layout Standard
-This is usually done by the following command
+\series medium
+Type
\begin_inset Quotes eld
\end_inset
+make
+\begin_inset Quotes erd
+\end_inset
+
+.
-\series bold
-\size large
-\emph on
-gunzip -c sdcc-<version number>.tar.gz | tar -xv -
\series default
-\size default
-\emph default
+ All of the source packages will compile, this can take a while.
+\layout Enumerate
+
+\series medium
+Type
\begin_inset Quotes eld
\end_inset
+make install
+\begin_inset Quotes erd
+\end_inset
-\layout Subsubsection
-Change to the main source directory (usually sdcc or sdcc-<version number>)
-\layout Subsubsection
+\series default
+ as root
+\series medium
+.
-Issue command to configure your system
-\layout Standard
+\series default
+ This copies the binary executables to the install directories.
+\layout Subsection
-The configure command has several options the most commonly used option
- is --prefix=<directory name>, where <directory name> is the final location
- for the sdcc executables and libraries, (default location is /usr/local).
- The installation process will create the following directory structure
- under the <directory name> specified.
-
+Windows Installation
\layout Standard
-bin/ - binary exectables (add to PATH environment variable)
-\newline
-share/
-\newline
+For installation under Windows you first need to pick between a pre-compiled
+ binary package, or installing the source package along with the Cygwin
+ package.
+ The binary package is the quickest to install, while the Cygwin package
+ includes all of the open source power tools used to compile the complete
+ SDCC source package in the Windows environment.
+ If you are not familiar with the Unix command line environment, you may
+ want to read the section on additional information for Windows users prior
+ to your initial installation.
+\layout Subsubsection
-\protected_separator
+Windows Install Using a Binary Package
+\layout Enumerate
-\protected_separator
+Download the binary package and unpack it using your favorite unpacking
+ tool(gunzip, WinZip, etc).
+ This should unpack to a group of sub-directories.
+ An example directory structure after unpacking is: c:
+\backslash
+usr
+\backslash
+local
+\backslash
+bin for the executables, c:
+\backslash
+usr
+\backslash
+local
+\backslash
+share
+\backslash
+sdcc
+\backslash
+include and c:
+\backslash
+usr
+\backslash
+local
+\backslash
+share
+\backslash
+sdcc
+\backslash
+lib for the include and libraries.
+\layout Enumerate
-\protected_separator
+Adjust your environment PATH to include the location of the bin directory.
+ For example, make a setsdcc.bat file with the following: set PATH=c:
+\backslash
+usr
+\backslash
+local
+\backslash
+bin;%PATH%
+\layout Enumerate
-\protected_separator
+When you compile with sdcc, you may need to specify the location of the
+ lib and include folders.
+ For example, sdcc -I c:
+\backslash
+usr
+\backslash
+local
+\backslash
+share
+\backslash
+sdcc
+\backslash
+include -L c:
+\backslash
+usr
+\backslash
+local
+\backslash
+share
+\backslash
+sdcc
+\backslash
+lib
+\backslash
+small test.c
+\layout Subsubsection
-\protected_separator
+Windows Install Using Cygwin
+\layout Enumerate
-\protected_separator
-sdcc51inc/ - include header files
-\newline
-\protected_separator
+\series medium
+Download and install the cygwin package from the redhat site
+\series default
+\emph on
-\protected_separator
+\begin_inset LatexCommand \htmlurl{http://sources.redhat.com/cygwin/}
-\protected_separator
+\end_inset
-\protected_separator
-\protected_separator
+\series medium
+\emph default
+.
+ Currently, this involved downloading a small install program which then
+ automates downloading and installing
+\series default
+selected parts of
+\series medium
+ the package
+\series default
+(a large 80M byte sized dowload for the whole thing)
+\series medium
+.
-\protected_separator
-sdcc51lib/ -
-\newline
+\series default
+
+\layout Enumerate
-\protected_separator
-\protected_separator
+\series medium
+Bring up a
+\series default
+Unix/Bash
+\series medium
+command line terminal from the Cygwin menu.
+\layout Enumerate
-\protected_separator
-\protected_separator
+\series medium
+Follow the instructions in the preceding Linux/Unix installation section.
+\layout Subsection
-\protected_separator
+Testing out the SDCC Compiler
+\layout Standard
-\protected_separator
+The first thing you should do after installing your SDCC compiler is to
+ see if it runs.
+ Type
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+sdcc --version
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ at the prompt, and the program should run and tell you the version.
+ If it doesn't run, or gives a message about not finding sdcc program, then
+ you need to check over your installation.
+ Make sure that the sdcc bin directory is in your executable search path
+ defined by the PATH environment setting(see the Trouble-shooting section
+ for suggestions).
+ Make sure that the sdcc program is in the bin folder, if not perhaps something
+ did not install correctly.
+\layout Standard
-\protected_separator
-\protected_separator
+\series medium
+SDCC binaries are commonly installed in a directory arrangement like this:
+\layout Standard
-\protected_separator
-\protected_separator
+\begin_inset Tabular
+<lyxtabular version="2" rows="3" columns="2">
+<features rotate="false" islongtable="false" endhead="0" endfirsthead="0" endfoot="0" endlastfoot="0">
+<column alignment="left" valignment="top" leftline="true" rightline="false" width="" special="">
+<column alignment="left" valignment="top" leftline="true" rightline="true" width="" special="">
+<row topline="true" bottomline="true" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
-small/ - Object & Library files for small model library
-\newline
+\layout Standard
-\protected_separator
+/
+\series medium
+usr/local/bin
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
-\protected_separator
+\series medium
+Holds executables(sdcc, s51, aslink,
+\series default
+...
+\series medium
+)
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="false" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
+/
+\series medium
+usr/local/share/sdcc/lib
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
-\protected_separator
+\series medium
+Holds common C
+\series default
+libraries
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
+/
+\series medium
+usr/local/share/sdcc/include
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
-large/ - Object & library files for large model library
-\newline
-\protected_separator
+\series medium
+Holds common C header files
+\end_inset
+</cell>
+</row>
+</lyxtabular>
-\protected_separator
+\end_inset
-\protected_separator
-\protected_separator
+\layout Standard
-\protected_separator
-\protected_separator
+\series medium
+Make sure the compiler works on a very simple example.
+ Type in the following test.c program using your favorite editor:
+\layout Standard
-\protected_separator
-\protected_separator
+\emph on
+main()
+\newline
+{ int i;
+\newline
+i = 0;
+\newline
+i += 10;
+\newline
+}
+\series medium
+\emph default
-\protected_separator
+\newline
-\protected_separator
+\layout Standard
-\protected_separator
-\protected_separator
+\series medium
+Compile this using the following command:
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
-ds390/ - Object & library files forDS80C390 library
-\newline
+sdcc -c test.c
+\begin_inset Quotes erd
+\end_inset
+.
+ If all goes well, the compiler will generate a test.asm and test.rel file.
+ Congratulations, you've just compiled your first program with SDCC.
+ We used the -c option to tell SDCC not to link the generated code, just
+ to keep things simple for this step.
\layout Standard
-The command
-\layout Standard
+\series medium
+The next step is to try it with the linker.
+ Type in
+\begin_inset Quotes eld
+\end_inset
-\series bold
-\size large
-\bar under
-'./configure --prefix=/usr/local
+sdcc test.c
\begin_inset Quotes erd
\end_inset
-
+.
+ 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 sdcc cannot find the usr/local/share/sdcc/lib
+\series default
+/small
+\series medium
+ directory(see the Install trouble-shooting section for suggestions).
\layout Standard
-will create configure the compiler to be installed in directory /usr/local/bin.
-\layout Subsubsection
-
-make
-\layout Standard
-After configuration step issue the command
+\series medium
+The final test is to ensure sdcc can use the standard header files and libraries.
+ Edit test.c and change it to the following:
\layout Standard
-\series bold
-\size large
-\bar under
-
+\emph on
+#include <string.h>
+\newline
+main()
+\newline
+{ char str1[10];
+\newline
+strcpy(str1,
\begin_inset Quotes eld
\end_inset
-make
+testing
\begin_inset Quotes erd
\end_inset
-
+);
+\newline
+}
\layout Standard
-This will compile the compiler
-\layout Subsubsection
-
+\series medium
+Compile this by typing:
\begin_inset Quotes eld
\end_inset
-make install
+sdcc test.c
\begin_inset Quotes erd
\end_inset
+.
+ 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 sdcc cannot
+ find the /usr/local/share/sdcc/include directory(see the Install trouble-shooti
+ng section for suggestions).
+\layout Subsection
-\layout Standard
-
-Will install the compiler and libraries in the appropriate directories.
+Install Trouble-shooting
\layout Subsubsection
-Special Notes for Windows Users.
- Provided by Michael Jamet[ mjamet@computer.org]
+SDCC cannot find libraries or header files.
\layout Standard
-Please note: these instructions are valid for Cygwin versions prior to 1.0.
- If you have Cygwin 1.0 or later, the generic
+The default installation assumes the libraries and header files are located
+ at
\begin_inset Quotes eld
\end_inset
-configure/make/make install
+/usr/local/share/sdcc/lib
\begin_inset Quotes erd
\end_inset
- procedure described above should work as expected from the Cygwin shell.
- If you have an earlier version of Cygwin, I strongly recommend upgrading.
- If, however, you insist on using an earlier version, the following instructions
- should prove helpful.
-\layout Standard
+ and
+\begin_inset Quotes eld
+\end_inset
+/usr/local/share/sdcc/include
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+.
+ An alternative is to specify these locations as compiler options like this:
+ sdcc -L /usr/local/sdcc/lib/small -I /usr/local/sdcc/include test.c
+\layout Subsubsection
+SDCC does not compile correctly.
\layout Standard
+A few things to try include starting from scratch by unpacking the .tgz source
+ package again in an empty directory.
+ If this doesn't work, you could try downloading a different version.
+ If this doesn't work, you can re-direct the install messages by doing the
+ following:
+\layout Standard
-\protected_separator
- How to install SDCC from source on a Windows 95 or Windows NT 4 system
-
+$./make > dump.txt 2>&1
\layout Standard
+After this you can examine the dump.txt files to locate the problem.
+ Or these messages can be attached to an email that could be helpful when
+ requesting help from the mailing list.
+\layout Subsubsection
+
+What the
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+./configure
+\begin_inset Quotes erd
+\end_inset
+ does
\layout Standard
+The
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
- This document describes how to install SDCC on a Win 95 or Win NT 4 system.
-
-\layout Standard
+./configure
+\begin_inset Quotes erd
+\end_inset
+ command is a script that analyzes your system and performs some configuration
+ to ensure the source package compiles on your system.
+ It will take a few minutes to run, and will compile a few tests to determine
+ what compiler features are installed.
+\layout Subsubsection
-\protected_separator
- These instructions probably work for Win 98 as well, but have not been
-
-\layout Standard
+What the
+\begin_inset Quotes eld
+\end_inset
+make
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
- tested on that platform.
-
+ does.
\layout Standard
+This runs the GNU make tool, which automatically compiles all the source
+ packages into the final installed binary executables.
+\layout Subsubsection
-\protected_separator
-
-\layout Standard
+What the
+\begin_inset Quotes eld
+\end_inset
+make install
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
- There are lots of little differences between UNIX and the Win32 Cygnus
-
+ command does.
\layout Standard
+This will install the compiler, other executables and libraries in to the
+ appropriate system directories.
+ The default is to copy the executables to /usr/local/bin and the libraries
+ and header files to /usr/local/share/sdcc/lib and /usr/local/share/sdcc/include.
+\layout Subsection
-\protected_separator
- environment which make porting more difficult than it should be.
-\protected_separator
- If
+Additional Information for Windows Users
\layout Standard
-
-\protected_separator
- you want the details, please contact me.
-\protected_separator
- Otherwise just follow these
+The standard method of installing on a Unix system involves compiling the
+ source package.
+ This is easily done under Unix, but under Windows it can be a more difficult
+ process.
+ The Cygwin is a large package to download, and the compilation runs considerabl
+y slower under Windows due to the overhead of the Cygwin tool set.
+ An alternative is to install a pre-compiled Windows binary package.
+ There are various trade-offs between each of these methods.
+
\layout Standard
+The Cygwin package allows a Windows user to run a Unix command line interface(ba
+sh shell) and also implements a Unix like file system on top of Windows.
+ Included are many of the famous GNU software development tools which can
+ augment the SDCC compiler.This is great if you have some experience with
+ Unix command line tools and file system conventions, if not you may find
+ it easier to start by installing a binary Windows package.
+ The binary packages work with the Windows file system conventions.
+\layout Subsubsection
-\protected_separator
- instructions.
-
+Getting started with Cygwin
\layout Standard
+SDCC is typically distributed as a tarred/gzipped file(.tgz).
+ This is a packed file similar to a .zip file.
+ Cygwin includes the tools you will need to unpack the SDCC distribution(tar
+ and gzip).
+ To unpack it, simply follow the instructions under the Linux/Unix install
+ section.
+ Before you do this you need to learn how to start a cygwin shell and some
+ of the basic commands used to move files, change directory, run commands
+ and so on.
+ The change directory command is
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+cd
+\begin_inset Quotes erd
+\end_inset
-\layout Standard
+, the move command is
+\begin_inset Quotes eld
+\end_inset
+mv
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
- 1.
- Install the Cygnus Software
-\layout Standard
+.
+ To print the current working directory, type
+\begin_inset Quotes eld
+\end_inset
+pwd
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
- Go to http://sourceware.cygnus.com/cygwin.
-\protected_separator
- Cygnus provides a UNIX like
-\layout Standard
+.
+ To make a directory, use
+\begin_inset Quotes eld
+\end_inset
+mkdir
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
- environment for Win 32 systems.
-\protected_separator
- Download "full.exe" and install.
-\protected_separator
- You
+.
\layout Standard
+There are some basic differences between Unix and Windows file systems you
+ should understand.
+ When you type in directory paths, Unix and the Cygwin bash prompt uses
+ forward slashes '/' between directories while Windows traditionally uses
+ '
+\backslash
+' backward slashes.
+ So when you work at the Cygwin bash prompt, you will need to use the forward
+ '/' slashes.
+ Unix does not have a concept of drive letters, such as
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
- MUST install it on your C drive.
-\protected_separator
- "full.exe" contains a shell AND many
-\layout Standard
+c:
+\begin_inset Quotes eld
+\end_inset
+, instead all files systems attach and appear as directories.
+\layout Subsubsection
-\protected_separator
- common UNIX utilities.
-
+Running SDCC as Native Compiled Executables
\layout Standard
+If you use the pre-compiled binaries, the install directories for the libraries
+ and header files may need to be specified on the sdcc command line like
+ this: sdcc -L c:
+\backslash
+usr
+\backslash
+local
+\backslash
+sdcc
+\backslash
+lib
+\backslash
+small -I c:
+\backslash
+usr
+\backslash
+local
+\backslash
+sdcc
+\backslash
+include test.c if you are running outside of a Unix bash shell.
+\layout Standard
-\protected_separator
+If you have successfully installed and compiled SDCC with the Cygwin package,
+ it is possible to compile into native .exe files by using the additional
+ makefiles included for this purpose.
+ For example, with the Borland 32-bit compiler you would run make -f Makefile.bcc.
+ A command line version of the Borland 32-bit compiler can be downloaded
+ from the Inprise web site.
+\layout Subsection
-\layout Standard
+SDCC on Other Platforms
+\layout Itemize
-\protected_separator
- 2.
- Download and Extract the Latest SDCC
-\layout Standard
+\series bold
+FreeBSD and other non-GNU Unixes
+\series default
+- Make sure the GNU make is installed as the default make tool.
+\layout Itemize
+SDCC has been ported to run under a variety of operating systems and processors.
+ If you can run GNU GCC/make then chances are good SDCC can be compiled
+ and run on your system.
+\layout Subsection
-\protected_separator
- The latest version can be found at
+Advanced Install Options
\layout Standard
+The
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+configure
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
- www.geocities.com/ResearchTriange/Forum/1353.
+ command has several options.
+ The most commonly used option is --prefix=<directory name>, where <directory
+ name> is the final location for the sdcc executables and libraries, (default
+ location is /usr/local).
+ The installation process will create the following directory structure
+ under the <directory name> specified.
\layout Standard
+bin/ - binary exectables (add to PATH environment variable)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+share/
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+sdcc/include/ - include header files
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+sdcc/lib/ -
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+small/ - Object & library files for small model library
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+large/ - Object & library files for large model library
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ds390/ - Object & library files forDS80C390 library
+\layout Standard
-\protected_separator
- It can be uncompressed with winzip.
-
+The command
\layout Standard
-\protected_separator
+\series bold
+\size large
+\bar under
+'./configure --prefix=/usr/local
+\begin_inset Quotes erd
+\end_inset
+
\layout Standard
+will configure the compiler to be installed in directory /usr/local/bin.
+\layout Subsection
-\protected_separator
- 3.
-\protected_separator
- Start a Cygnus Shell
+Components of SDCC
\layout Standard
-
-\protected_separator
- There should be an entry in the Start Menu for Cygnus.
-\protected_separator
- Invoke the shell.
-
+SDCC is not just a compiler, but a collection of tools by various developers.
+ These include linkers, assemblers, simulators and other components.
+ Here is a summary of some of the components.
+ Note that the included simulator and assembler have separate documentation
+ which you can find in the source package in their respective directories.
+ As SDCC grows to include support for other processors, other packages from
+ various developers are included and may have their own sets of documentation.
\layout Standard
-
-\protected_separator
- This gives you a UNIX like environment.
-\protected_separator
- FROM THIS POINT ON, DIRECTORIES
+You might want to look at the various executables which are installed in
+ the bin directory.
+ At the time of this writing, we find the following programs:
\layout Standard
-\protected_separator
- MUST BE SPECIFIED WITH FORWARD SLASHES (/) NOT THE DOS STYLE BACK
+\series bold
+sdcc
+\series default
+ - The compiler.
\layout Standard
-\protected_separator
- SLASHES (
-\backslash
-) BECAUSE THIS IS WHAT UNIX EXPECTS.
-\protected_separator
- -
+\series bold
+aslink
+\series default
+ -The linker for 8051 type processors.
\layout Standard
-\protected_separator
-
-\protected_separator
- ex.
- "
-\backslash
-winnt" would be "/winnt" under the shell.
-
+\series bold
+asx8051
+\series default
+ - The assembler for 8051 type processors.
\layout Standard
-\protected_separator
-
+\series bold
+sdcpp
+\series default
+ - The C preprocessor.
\layout Standard
-\protected_separator
- 4.
- Change Directory to Where SDCC was extracted (referred to as INSTALLDIR)
-
+\series bold
+sdcpd
+\series default
+ - The source debugger.
\layout Standard
-\protected_separator
-
+\series bold
+s51
+\series default
+ - The ucSim 8051 simulator.
\layout Standard
-\protected_separator
- ex.
- cd /sdcc218Da.
-\protected_separator
- If you extracted to a drive OTHER THAN C, the drive
+\series bold
+linkz80, linkgbz80
+\series default
+ - The Z80 and GameBoy Z80 linkers.
\layout Standard
-\protected_separator
- must be specified as part of the path.
- For example, if you extracted to
+\series bold
+as-z80, as-gbz80
+\series default
+ - The Z80 and GameBoy Z80 assemblers.
\layout Standard
-\protected_separator
- your "g drive", type the following: "cd //g/mydir".
-\protected_separator
- You must use "//"
+\series bold
+packihx
+\series default
+ - A tool to pack Intel hex files.
\layout Standard
+As development for other processors proceeds, this list will expand to include
+ executables to support processors like AVR, PIC, etc.
+\layout Subsubsection
-\protected_separator
- to specify the drive.
-
+cpp ( C-Preprocessor)
\layout Standard
+The preprocessor is extracted into the directory
+\emph on
+SDCCDIR/cpp
+\emph default
+, it is a modified version of the GNU preprocessor.
+ The C preprocessor is used to pull in #include sources, process #ifdef
+ statements, #defines and so on.
+\layout Subsubsection
-\protected_separator
-
+asxxxx & aslink ( The assembler and Linkage Editor)
\layout Standard
+This is retargettable assembler & linkage editor, it was developed by Alan
+ Baldwin, John Hartman created the version for 8051, and I (Sandeep) have
+ some enhancements and bug fixes for it to work properly with the SDCC.
+ This component is extracted into the directory
+\emph on
+SDCCDIR/asxxxx.
+\layout Subsubsection
-\protected_separator
- 5.
- Make Dirs Which are Automatically Made During the UNIX Installation
+SDCC - The compiler
\layout Standard
+This is the actual compiler, it in turn uses the c-preprocessor and invokes
+ the assembler and linkage editors.
+ All files with the prefix
+\emph on
+SDCC
+\emph default
+are part of the compiler and are extracted into the the directory
+\emph on
+SDCCDIR.
+\layout Subsubsection
-\protected_separator
- From the INSTALLDIR,
+S51 - Simulator
\layout Standard
+s51 is a freeware, opensource simulator developed by Daniel Drotos <drdani@mazso
+la.iit.uni-miskolc.hu>.
+ The executable is built as part of the build process, for more information
+ visit Daniel's website at <http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51/
+>.
+\layout Subsubsection
-\protected_separator
-
+SDCDB - Source Level Debugger
\layout Standard
+SDCDB is the companion source level debugger .
+ The current version of the debugger uses Daniel's Simulator S51, but can
+ be easily changed to use other simulators.
+\layout Section
-\protected_separator
+Using SDCC
+\layout Subsection
-\protected_separator
- mkdir -p bin
-\protected_separator
+Compiling
+\layout Subsubsection
-\protected_separator
- (not a typo, just "bin")
+Single Source File Projects
\layout Standard
-
-\protected_separator
-
-\protected_separator
- mkdir -p /bin
+For single source file 8051 projects the process is very simple.
+ Compile your programs with the following command
\layout Standard
-\protected_separator
-
-\protected_separator
- mkdir -p /usr/local/bin
+\size footnotesize
+sdcc sourcefile.c
\layout Standard
+The above command will compile ,assemble and link your source file.
+ Output files are as follows.
+\layout Itemize
-\protected_separator
-\protected_separator
- mkdir -p /usr/local/share
-\layout Standard
+\size footnotesize
+sourcefile.asm - Assembler source file created by the compiler
+\layout Itemize
-\protected_separator
-
-\protected_separator
- mkdir -p /usr/local/share/sdcc51lib
-\layout Standard
+\size footnotesize
+sourcefile.lst - Assembler listing file created by the Assembler
+\layout Itemize
-\protected_separator
+\size footnotesize
+sourcefile.rst - Assembler listing file updated with linkedit information
+ , created by linkage editor
+\layout Itemize
-\protected_separator
- mkdir -p /usr/local/share/sdcc51inc
-\layout Standard
+\size footnotesize
+sourcefile.sym - symbol listing for the sourcefile, created by the assembler.
+\layout Itemize
-\protected_separator
-\protected_separator
- mkdir -p /tmp
-\layout Standard
+\size footnotesize
+sourcefile.rel - Object file created by the assembler, input to Linkage editor.
+\layout Itemize
-\protected_separator
+\size footnotesize
+sourcefile.map - The memory map for the load module, created by the Linker.
+\layout Itemize
-\layout Standard
+\size footnotesize
+sourcefile.<ihx | s19> - The load module : ihx - Intel hex format (default
+ ), s19 - Motorola S19 format when compiler option --out-fmt-s19 is used.
+\layout Subsubsection
-\protected_separator
- (When a path from the root directory is specified WITHOUT a drive, the
-
+Projects with Multiple Source Files
\layout Standard
-
-\protected_separator
- drive defaults to c.
-\protected_separator
- For example /michael/newuser => c:
-\backslash
-michael
-\backslash
-newuser)
+SDCC can compile only ONE file at a time.
+ Let us for example assume that you have a project containing the following
+ files.
\layout Standard
-\protected_separator
-
+\size footnotesize
+foo1.c ( contains some functions )
\layout Standard
-\protected_separator
- 6.
-\protected_separator
- Add Programs to /bin Expected by the Installation Process
+\size footnotesize
+foo2.c (contains some more functions)
\layout Standard
-\protected_separator
-
-\protected_separator
- - Look at your path: echo $PATH
+\size footnotesize
+foomain.c (contains more functions and the function main)
\layout Standard
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- One of the fields is the diretory with the CYGNUS programs.
-
+The first two files will need to be compiled separately with the commands
\layout Standard
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ex.
- /CYGNUS/CYGWIN~1/H-I586/BIN
+\size footnotesize
+sdcc -c foo1.c
\layout Standard
-\protected_separator
-
+\size footnotesize
+sdcc -c foo2.c
\layout Standard
-
-\protected_separator
-
-\protected_separator
- - cd to the directory found above.
-\protected_separator
- You may have to fiddle with the
+Then compile the source file containing main and link the other files together
+ with the following command.
\layout Standard
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- case (upper or lower) here because the PATH is SHOWN as all upper
+\size footnotesize
+sdcc foomain.c foo1.rel foo2.rel
\layout Standard
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- case, but is actually mixed.
-\protected_separator
- To help you along, you may type
+Alternatively
+\emph on
+foomain.c
+\emph default
+ can be separately compiled as well
\layout Standard
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- a letter or 2 followed by the escape key.
-\protected_separator
- The shell will fill
+\size footnotesize
+sdcc -c foomain.c
\layout Standard
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- out the remaining letters IF THEY describe a unique directory.
-
+\size footnotesize
+sdcc foomain.rel foo1.rel foo2.rel
\layout Standard
+The file containing the main function MUST be the FIRST file specified in
+ the command line , since the linkage editor processes file in the order
+ they are presented to it.
+\layout Subsubsection
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- If you have problems here, cd one directory and type "ls".
-\protected_separator
- "ls"
+Projects with Additional Libraries
\layout Standard
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- is the equivalent of "dir/w".
-
+Some reusable routines may be compiled into a library, see the documentation
+ for the assembler and linkage editor in the directory
+\emph on
+SDCCDIR/asxxxx/asxhtm.htm
+\emph default
+this describes how to create a
+\emph on
+.lib
+\emph default
+ library file, the libraries created in this manner may be included using
+ the command line, make sure you include the -L <library-path> option to
+ tell the linker where to look for these files.
+ Here is an example, assuming you have the source file
+\emph on
+'foomain.c
+\emph default
+' and a library
+\emph on
+ 'foolib.lib'
+\emph default
+ in the directory
+\emph on
+'mylib'
+\emph default
+.
\layout Standard
-\protected_separator
-
+\size footnotesize
+sdcc foomain.c foolib.lib -L mylib
\layout Standard
-
-\protected_separator
-
-\protected_separator
- - Copy the following:
+Note here that
+\emph on
+'mylib
+\emph default
+' must be an absolute path name.
\layout Standard
+The view of the way the linkage editor processes the library files, it is
+ recommended that you put each source routine in a separate file and combine
+ them using the .lib file.
+ For an example see the standard library file 'libsdcc.lib' in the directory
+ SDCCDIR/sdcc51lib.
+\layout Subsection
-\protected_separator
-
-\protected_separator
+Command Line Options
+\layout Subsubsection
-\protected_separator
- cp sh.exe /bin
-\layout Standard
+Processor Selection Options
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+-mmcs51
+\series default
+ Generate code for the MCS51 (8051) family of processors.
+ This is the default processor target.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
- cp pwd.exe /bin
-\layout Standard
+\series bold
+-mds390
+\series default
+ Generate code for the DS80C390 processor.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+-mz80
+\series default
+ Generate code for the Z80 family of processors.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
- cp echo.exe /bin
-\layout Standard
+\series bold
+-mgbz80
+\series default
+ Generate code for the GameBoy Z80 processor.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+-mavr
+\series default
+ Generate code for the Atmel AVR processor(In development, not complete).
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+-mpic14
+\series default
+ Generate code for the PIC 14-bit processors(In development, not complete).
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- 7.
- Go back to the INSTALLDIR
-\layout Standard
+\series bold
+-mtlcs900h
+\series default
+ Generate code for the Toshiba TLCS-900H processor(In development, not complete).
+\layout Subsubsection
-\protected_separator
+Path, Lib and Define Options
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- cd INSTALLDIR
-\layout Standard
+\series bold
+\bar under
+-I<path>
+\series default
+\bar default
+ The additional location where the pre processor will look for <..h> or
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
- ex.
- cd //d/sdcc218Da
-\layout Standard
+..h
+\begin_inset Quotes erd
+\end_inset
+ files.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\layout Standard
+\series bold
+\size large
+\bar under
+-D<macro[=value]>
+\series default
+\size default
+\bar default
+ Command line definition of macros.
+ Passed to the pre processor.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- 8.
- Run the configure Program
-\layout Standard
+\series bold
+\size large
+\bar under
+--lib-path(-L)
+\size default
+
+\series default
+\bar default
+<absolute path to additional libraries> This option is passed to the linkage
+ editor, additional libraries search path.
+ The path name must be absolute.
+ Additional library files may be specified in the command line .
+ See section Compiling programs for more details.
+\layout Subsubsection
+MCS51 Options
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
- ./configure
-\layout Standard
+\series bold
+\size large
+--model-large
+\series default
+\size default
+ Generate code for Large model programs see section Memory Models for more
+ details.
+ If this option is used all source files in the project should be compiled
+ with this option.
+ In addition the standard library routines are compiled with small model
+ , they will need to be recompiled.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- The "./" is important because your current directory is NOT in your path.
+\series bold
+\size large
+\bar under
+--model-small
+\series default
+\emph on
+\bar default
-\layout Standard
+\size default
+\emph default
+Generate code for Small Model programs see section Memory Models for more
+ details.
+ This is the default model.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- Under DOS, your current directory was implicitly always the first entry
+\series bold
+\size large
+\bar under
+--model-flat24
+\series default
+\emph on
+\bar default
-\layout Standard
+\size default
+\emph default
+Generate code forDS80C390 24-bit flat mode.
+ See section Memory Models for more details.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- in your path.
+\series bold
+\size large
+\bar under
+--stack-
+\emph on
+auto
+\series default
+\bar default
-\layout Standard
-
-
-\protected_separator
-
-\layout Standard
+\size default
+\emph default
+All functions in the source file will be compiled as
+\emph on
+reentrant
+\emph default
+, i.e.
+ the parameters and local variables will be allocated on the stack.
+ see section Parameters and Local Variables for more details.
+ If this option is used all source files in the project should be compiled
+ with this option.
+
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- 9.
- Run make
-\layout Standard
+\series bold
+\size large
+\bar under
+--xstack
+\series default
+\size default
+\bar default
+ Uses a pseudo stack in the first 256 bytes in the external ram for allocating
+ variables and passing parameters.
+ See section on external stack for more details.
+\layout Subsubsection
+Optimization Options
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
- make
-\layout Standard
+\series bold
+\size large
+\bar under
+--nogcse
+\series default
+\size default
+\bar default
+ Will not do global subexpression elimination, this option may be used when
+ the compiler creates undesirably large stack/data spaces to store compiler
+ temporaries.
+ A warning message will be generated when this happens and the compiler
+ will indicate the number of extra bytes it allocated.
+ It recommended that this option NOT be used , #pragma NOGCSE can be used
+ to turn off global subexpression elimination for a given function only.
+\layout List
+\labelwidthstring 00.00.0000
+
+\series bold
+\size large
+\bar under
+--noinvariant
+\series default
+\size default
+\bar 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 section Loop Invariants.It
+ recommended that this option NOT be used , #pragma NOINVARIANT can be used
+ to turn off invariant optimizations for a given function only.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\layout Standard
+\series bold
+\size large
+\bar under
+--noinduction
+\series default
+\size default
+\bar default
+ Will not do loop induction optimizations, see section Strength reduction
+ for more details.It recommended that this option NOT be used , #pragma NOINDUCTI
+ON can be used to turn off induction optimizations for given function only.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- This process takes quite some time under Win 32.
-
-\layout Standard
+\series bold
+\size large
+\bar under
+--nojtbound
+\series default
+\size default
+\bar default
+ Will not generate boundary condition check when switch statements are implement
+ed using jump-tables.
+ See section Switch Statements for more details.It recommended that this
+ option NOT be used , #pragma NOJTBOUND can be used to turn off boundary
+ checking for jump tables for a given function only.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+\size large
+\bar under
+--noloopreverse
+\series default
+\bar default
+
+\size default
+Will not do loop reversal optimization
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+\size large
+\bar under
+--noregparms
+\series default
+\size default
+\bar default
+ By default the first parameter is passed using global registers (DPL,DPH,B,ACC).
+ This option will disable parameter passing using registers.
+ NOTE: if your program uses the 16/32 bit support routines (for multiplication/d
+ivision) these library routines will need to be recompiled with the --noregparms
+ option as well.
+\layout Subsubsection
-\protected_separator
- 10.
- Install the Newly Built Software
-\layout Standard
+DS390 Options
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+--stack-auto
+\series default
+ See MCS51 section for description.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- make install
-\layout Standard
+\series bold
+--stack-10bit
+\series default
+ This option generates code for the 10 bit stack mode of the Dallas DS80C390
+ part.
+ In this mode, the stack is located in the lower 1K of the internal RAM,
+ which is mapped to 0x400000.
+ Note that the support is incomplete, since it still uses a single byte
+ as the stack pointer.
+ This means that only the lower 256 bytes of the potential 1K stack space
+ can actually be used.
+ However, this does allow you to reclaim the precious 256 bytes of low RAM
+ for use for the DATA and IDATA segments.
+ The compiler will not generate any code to put the processor into 10 bit
+ stack mode.
+ It is important to ensure that the processor is in this mode before calling
+ any re-entrant functions compiled with this option.
+ In principle, this should work with the --stack-auto option, but that has
+ not been tested.
+ It is incompatible with the --xstack option.
+ It also only makes sense if the processor is in 24 bit contiguous addressing
+ mode (see the --model-flat24 option).
+\layout Subsubsection
-\protected_separator
+Other Options
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+\size large
+\bar under
+--callee-saves function1[,function2][,function3]....
-\protected_separator
- This will partially install the software into the /usr/local directories
-
-\layout Standard
+\series default
+\size default
+\bar default
+ The compiler by default uses a caller saves convention for register saving
+ across function calls, however this can cause unneccessary register pushing
+ & popping when calling small functions from larger functions.
+ This option can be used to switch the register saving convention for the
+ function names specified.
+ The compiler will not save registers when calling these functions, extra
+ code will be generated at the entry & exit for these functions to save
+ & restore the registers used by these functions, this can SUBSTANTIALLY
+ reduce code & improve run time performance of the generated code.
+ In future the compiler (with interprocedural analysis) will be able to
+ determine the appropriate scheme to use for each function call.
+ DO NOT use this option for built-in functions such as _muluint..., if this
+ option is used for a library function the appropriate library function
+ needs to be recompiled with the same option.
+ If the project consists of multiple source files then all the source file
+ should be compiled with the same --callee-saves option string.
+ Also see Pragma Directive CALLEE-SAVES.
+ .
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- created in step 5.
-\protected_separator
- What it actually doing is copying the .c, .h and
-\layout Standard
+\series bold
+\bar under
+--debug
+\series default
+\bar default
+When this option is used the compiler will generate debug information ,
+ that can be used with the SDCDB.
+ The debug information is collected in a file with .cdb extension.
+ For more information see documentation for SDCDB.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- library files to directories under /usr/local/share.
+\series bold
+\size large
+\bar under
+--regextend
+\size default
-\layout Standard
+\series default
+\bar default
+ This option will cause the compiler to define pseudo registers , if this
+ option is used, all source files in the project should be compiled with
+ this option.
+ See section Register Extension for more details.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+\size large
+\bar under
+--compile-only
+\series default
+\bar default
+(-c)
+\size default
+ will compile and assemble the source only, will not call the linkage editor.
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
+\series bold
+\size large
+\bar under
+--xram-loc
+\series default
+\size default
+\bar default
+<Value> The start location of the external ram, default value is 0.
+ The value entered can be in Hexadecimal or Decimal format .eg.
+ --xram-loc 0x8000 or --xram-loc 32768.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- It will NOT be able to install the actual programs (binaries) because
-\layout Standard
+\series bold
+\size large
+\bar under
+--code-loc
+\series default
+\size default
+\bar default
+<Value> The start location of the code segment , default value 0.
+ Note when this option is used the interrupt vector table is also relocated
+ to the given address.
+ The value entered can be in Hexadecimal or Decimal format .eg.
+ --code-loc 0x8000 or --code-loc 32768.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- it does not know programs on Win32 systems have ".exe" extensions.
-
-\layout Standard
+\series bold
+\size large
+\bar under
+--stack-loc
+\series default
+\size default
+\bar default
+<Value> The initial value of the stack pointer.
+ The default value of the stack pointer is 0x07 if only register bank 0
+ is used, if other register banks are used then the stack pointer is initialized
+ to the location above the highest register bank used.
+ eg.
+ if register banks 1 & 2 are used the stack pointer will default to location
+ 0x18.
+ The value entered can be in Hexadecimal or Decimal format .eg.
+ --stack-loc 0x20 or --stack-loc 32.
+ If all four register banks are used the stack will be placed after the
+ data segment (equivalent to --stack-after-data)
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- For example, it tries to install sdcc instead of sdcc.exe.
-
-\layout Standard
+\series bold
+\size large
+\bar under
+--stack-after-data
+\series default
+\size default
+\bar default
+ This option will cause the stack to be located in the internal ram after
+ the data segment.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\layout Standard
+\series bold
+\size large
+\bar under
+--data-loc
+\series default
+\size default
+\bar default
+<Value> The start location of the internal ram data segment, the default
+ value is 0x30.The value entered can be in Hexadecimal or Decimal format
+ .eg.
+ --data-loc 0x20 or --data-loc 32.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- After the automated part is finished, you must manually copy the binaries:
-
-\layout Standard
+\series bold
+\size large
+\bar under
+--idata-loc
+\series default
+\size default
+\bar default
+<Value> The start location of the indirectly addressable internal ram, default
+ value is 0x80.
+ The value entered can be in Hexadecimal or Decimal format .eg.
+ --idata-loc 0x88 or --idata-loc 136.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
+\series bold
+\size large
+\bar under
+--peep-file
+\series default
+\size default
+\bar default
+<filename> This option can be used to use additional rules to be used by
+ the peep hole optimizer.
+ See section Peep Hole optimizations for details on how to write these rules.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
- cd bin
-\protected_separator
- (This is the bin directory in your INSTALLDIR)
-\layout Standard
-
-\protected_separator
-
-\protected_separator
- cp * /usr/local/bin
-\layout Standard
-
-
-\protected_separator
-
-\layout Standard
-
-
-\protected_separator
- 11.
- Make sure /usr/local/bin is in Your PATH
-\layout Standard
-
-
-\protected_separator
- You may add c:
-\backslash
-usr
-\backslash
-local
-\backslash
-bin to your path however your Win32 system allows.
-\protected_separator
- For
-\layout Standard
-
-
-\protected_separator
- example you may add it to the PATH statement in autoexec.bat.
-
-\layout Standard
-
-
-\protected_separator
-
-\layout Standard
-
-
-\protected_separator
- Good luck.
-\protected_separator
- If you have any questions send them to me or post them
-\layout Standard
-
-
-\protected_separator
- to the list.
-\layout Subsubsection
-
-FreeBSD and other non-GNU unixes
-\layout Standard
-
-Note that the SDCC build environment uses Gnu make.
- If this is not the default 'make' on your system, you may need to install
- it.
- On many systems, Gnu make is installed as 'gmake'.
-\layout Section
-
-Compiling.
-\begin_inset LatexCommand \label{Compiling}
-
-\end_inset
-
-
-\layout Subsection
-
-Single Source file projects.
-\begin_inset LatexCommand \label{One Source File}
-
-\end_inset
-
-
-\layout Standard
-
-For single source file projects the process is very simple.
- Compile your programs with the following command
-\layout Standard
-
-
-\size footnotesize
-sdcc sourcefile.c
-\layout Standard
-
-The above command will compile ,assemble and link your source file.
- Output files are as follows.
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.asm - Assembler source file created by the compiler
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.lst - Assembler listing file created by the Assembler
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.rst - Assembler listing file updated with linkedit information
- , created by linkage editor
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.sym - symbol listing for the sourcefile, created by the assembler.
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.rel - Object file created by the assembler, input to Linkage editor.
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.map - The memory map for the load module, created by the Linker.
-\layout Itemize
-
-
-\size footnotesize
-sourcefile.<ihx | s19> - The load module : ihx - Intel hex format (default
- ), s19 - Motorola S19 format when compiler option --out-fmt-s19 is used.
-\layout Subsection
-
-Projects with multiple source files.
-\layout Standard
-
-SDCC can compile only ONE file at a time.
- Let us for example assume that you have a project containing the following
- files.
-\layout Standard
-
-
-\size footnotesize
-foo1.c ( contains some functions )
-\layout Standard
-
-
-\size footnotesize
-foo2.c (contains some more functions)
-\layout Standard
-
-
-\size footnotesize
-foomain.c (contains more functions and the function main)
-\layout Standard
-
-The first two files will need to be compiled separately with the commands
-\layout Standard
-
-
-\size footnotesize
-sdcc -c foo1.c
-\layout Standard
-
-
-\size footnotesize
-sdcc -c foo2.c
-\layout Standard
-
-Then compile the source file containing main and link the other files together
- with the following command.
-\layout Standard
-
-
-\size footnotesize
-sdcc foomain.c foo1.rel foo2.rel
-\layout Standard
-
-Alternatively
-\emph on
-foomain.c
-\emph default
- can be separately compiled as well
-\layout Standard
-
-
-\size footnotesize
-sdcc -c foomain.c
-\layout Standard
-
-
-\size footnotesize
-sdcc foomain.rel foo1.rel foo2.rel
-\layout Standard
-
-The file containing the main function MUST be the FIRST file specified in
- the command line , since the linkage editor processes file in the order
- they are presented to it.
-\layout Subsection
-
-Projects with additional libraries.
-\layout Standard
-
-Some reusable routines may be compiled into a library, see the documentation
- for the assembler and linkage editor in the directory
-\emph on
-SDCCDIR/asxxxx/asxhtm.htm
-\emph default
-this describes how to create a
-\emph on
-.lib
-\emph default
- library file, the libraries created in this manner may be included using
- the command line, make sure you include the -L <library-path> option to
- tell the linker where to look for these files.
- Here is an example, assuming you have the source file
-\emph on
-'foomain.c
-\emph default
-' and a library
-\emph on
- 'foolib.lib'
-\emph default
- in the directory
-\emph on
-'mylib'
-\emph default
-.
-\layout Standard
-
-
-\size footnotesize
-sdcc foomain.c foolib.lib -L mylib
-\layout Standard
-
-Note here that
-\emph on
-'mylib
-\emph default
-' must be an absolute path name.
-\layout Standard
-
-The view of the way the linkage editor processes the library files, it is
- recommended that you put each source routine in a separate file and combine
- them using the .lib file.
- For an example see the standard library file 'libsdcc.lib' in the directory
- SDCCDIR/sdcc51lib.
-\layout Section
-
-Command Line options
-\begin_inset LatexCommand \label{Command Line Options}
-
-\end_inset
-
-
-\layout Itemize
-
--mmcs51
-\begin_inset LatexCommand \label{-mmcs51}
-
-\end_inset
-
-Generate code for the MCS51 (8051) family of processors.
- This is the default processor target.
-\layout Itemize
-
--mz80
-\begin_inset LatexCommand \label{-mz80}
-
-\end_inset
-
-Generate code for the Z80 family of processors.
- Various other options may not be applicable in this mode.
-
-\layout Itemize
-
-
-\series bold
--mds390
-\series default
-
-\begin_inset LatexCommand \label{-mds390}
-
-\end_inset
-
-Generate code for the DS80C390 processor.
- Various other options may not be applicable in this mode.
-\layout Itemize
-
-
-\series bold
-\size large
---model-large
-\emph on
-
-\begin_inset LatexCommand \label{--model-large}
-
-\end_inset
-
-
-\series default
-\size default
-\emph default
- Generate code for Large model programs see section Memory Models for more
- details.
- If this option is used all source files in the project should be compiled
- with this option.
- In addition the standard library routines are compiled with small model
- , they will need to be recompiled.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---model-small
-\series default
-\emph on
-\bar default
-
-\size default
-\emph default
-
-\begin_inset LatexCommand \label{--model-small}
-
-\end_inset
-
-Generate code for Small Model programs see section Memory Models for more
- details.
- This is the default model.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---model-flat24
-\series default
-\emph on
-\bar default
-
-\size default
-\emph default
-
-\begin_inset LatexCommand \ref[--model-flat24]{--model-flat24}
-
-\end_inset
-
-Generate code forDS80C390 24-bit flat mode.
- See section Memory Models for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---stack-
-\emph on
-auto
-\series default
-\bar default
-
-\size default
-\emph default
-
-\begin_inset LatexCommand \label{--stack-auto}
-
-\end_inset
-
-All functions in the source file will be compiled as
-\emph on
-reentrant
-\emph default
-, i.e.
- the parameters and local variables will be allocated on the stack.
- see section Parameters and Local Variables for more details.
- If this option is used all source files in the project should be compiled
- with this option.
-
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---xstack
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--xstack}
-
-\end_inset
-
- Uses a pseudo stack in the first 256 bytes in the external ram for allocating
- variables and passing parameters.
- See section on external stack for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---nogcse
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--nogcse}
-
-\end_inset
-
- Will not do global subexpression elimination, this option may be used when
- the compiler creates undesirably large stack/data spaces to store compiler
- temporaries.
- A warning message will be generated when this happens and the compiler
- will indicate the number of extra bytes it allocated.
- It recommended that this option NOT be used , #pragma NOGCSE can be used
- to turn off global subexpression elimination for a given function only.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---noinvariant
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--noinvariant}
-
-\end_inset
-
- 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 section Loop Invariants.It
- recommended that this option NOT be used , #pragma NOINVARIANT can be used
- to turn off invariant optimizations for a given function only.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---noinduction
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--noinduction}
-
-\end_inset
-
- Will not do loop induction optimizations, see section Strength reduction
- for more details.It recommended that this option NOT be used , #pragma NOINDUCTI
-ON can be used to turn off induction optimizations for given function only.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---nojtbound
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--nojtbound}
-
-\end_inset
-
- Will not generate boundary condition check when switch statements are implement
-ed using jump-tables.
- See section Switch Statements for more details.It recommended that this
- option NOT be used , #pragma NOJTBOUND can be used to turn off boundary
- checking for jump tables for a given function only.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---noloopreverse
-\series default
-\bar default
-
-\size default
-
-\begin_inset LatexCommand \label{--noloopreverse}
-
-\end_inset
-
-Will not do loop reversal optimization
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---noregparms
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--noregparms}
-
-\end_inset
-
- By default the first parameter is passed using global registers (DPL,DPH,B,ACC).
- This option will disable parameter passing using registers.
- NOTE: if your program uses the 16/32 bit support routines (for multiplication/d
-ivision) these library routines will need to be recompiled with the --noregparms
- option as well.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---callee-saves function1[,function2][,function3]....
-
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--callee-saves}
-
-\end_inset
-
-The compiler by default uses a caller saves convention for register saving
- across function calls, however this can cause unneccessary register pushing
- & popping when calling small functions from larger functions.
- This option can be used to switch the register saving convention for the
- function names specified.
- The compiler will not save registers when calling these functions, extra
- code will be generated at the entry & exit for these functions to save
- & restore the registers used by these functions, this can SUBSTANTIALLY
- reduce code & improve run time performance of the generated code.
- In future the compiler (with interprocedural analysis) will be able to
- determine the appropriate scheme to use for each function call.
- DO NOT use this option for built-in functions such as _muluint..., if this
- option is used for a library function the appropriate library function
- needs to be recompiled with the same option.
- If the project consists of multiple source files then all the source file
- should be compiled with the same --callee-saves option string.
- Also see Pragma Directive
-\begin_inset LatexCommand \ref{Pragmaa}
-
-\end_inset
-
- CALLEE-SAVES.
-\begin_inset LatexCommand \ref{pragma callee-saves}
-
-\end_inset
-
- .
-\layout Itemize
-
-
-\series bold
-\bar under
---debug
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--debug}
-
-\end_inset
-
-When this option is used the compiler will generate debug information ,
- that can be used with the SDCDB.
- The debug information is collected in a file with .cdb extension.
- For more information see documentation for SDCDB.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---regextend
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--regextend}
-
-\end_inset
-
- This option will cause the compiler to define pseudo registers , if this
- option is used, all source files in the project should be compiled with
- this option.
- See section Register Extension for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---compile-only
-\series default
-\bar default
-(-c)
-\size default
-
-\begin_inset LatexCommand \label{--compile-only}
-
-\end_inset
-
- will compile and assemble the source only, will not call the linkage editor.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---xram-loc
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--xram-loc}
-
-\end_inset
-
-<Value> The start location of the external ram, default value is 0.
- The value entered can be in Hexadecimal or Decimal format .eg.
- --xram-loc 0x8000 or --xram-loc 32768.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---code-loc
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--code-loc}
-
-\end_inset
-
-<Value> The start location of the code segment , default value 0.
- Note when this option is used the interrupt vector table is also relocated
- to the given address.
- The value entered can be in Hexadecimal or Decimal format .eg.
- --code-loc 0x8000 or --code-loc 32768.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---stack-loc
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--stack-loc}
-
-\end_inset
-
-<Value> The initial value of the stack pointer.
- The default value of the stack pointer is 0x07 if only register bank 0
- is used, if other register banks are used then the stack pointer is initialized
- to the location above the highest register bank used.
- eg.
- if register banks 1 & 2 are used the stack pointer will default to location
- 0x18.
- The value entered can be in Hexadecimal or Decimal format .eg.
- --stack-loc 0x20 or --stack-loc 32.
- If all four register banks are used the stack will be placed after the
- data segment (equivalent to --stack-after-data)
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---stack-after-data
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--stack-after-data}
-
-\end_inset
-
-This option will cause the stack to be located in the internal ram after
- the data segment.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---data-loc
-\series default
-\bar default
-
-\size default
-
-\begin_inset LatexCommand \label{--data-loc}
-
-\end_inset
-
-<Value> The start location of the internal ram data segment, the default
- value is 0x30.The value entered can be in Hexadecimal or Decimal format
- .eg.
- --data-loc 0x20 or --data-loc 32.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---idata-loc
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--idata-loc}
-
-\end_inset
-
-<Value> The start location of the indirectly addressable internal ram, default
- value is 0x80.
- The value entered can be in Hexadecimal or Decimal format .eg.
- --idata-loc 0x88 or --idata-loc 136.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---peep-file
-\size default
-
-\begin_inset LatexCommand \label{--peep-file}
-
-\end_inset
-
-
-\series default
-\bar default
-<filename> This option can be used to use additional rules to be used by
- the peep hole optimizer.
- See section Peep Hole optimizations for details on how to write these rules.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---lib-path (-L)
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--lib-path}
-
-\end_inset
-
-<absolute path to additional libraries> This option is passed to the linkage
- editor, additional libraries search path.
- The path name must be absolute.
- Additional library files may be specified in the command line .
- See section Compiling programs for more details.
-\layout Itemize
-
-
-\series bold
-\bar under
--I <path>
-\begin_inset LatexCommand \label{-I}
-
-\end_inset
-
-
-\series default
-\bar default
- The additional location where the pre processor will look for <..h> or
-\begin_inset Quotes eld
-\end_inset
-
-..h
-\begin_inset Quotes erd
-\end_inset
-
- files.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--D<macro[=value]>
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-D}
-
-\end_inset
-
-Command line definition of macros.
- Passed to the pre processor.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--E
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-E}
-
-\end_inset
-
- Run only the C preprocessor.
- Preprocess all the C source files specified and output the results to standard
- output.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--M
-\bar default
-
-\begin_inset LatexCommand \label{-M}
-
-\end_inset
-
-
-\series default
-\size default
- Tell the preprocessor to output a rule suitable for make describing the
- dependencies of each object file.
- For each source file, the preprocessor outputs one make-rule whose target
- is the object file name for that source file and whose dependencies are
- all the files `#include'd in it.
- This rule may be a single line or may be continued with `
-\backslash
-'-newline if it is long.
- The list of rules is printed on standard output instead of the preprocessed
- C program.
- `-M' implies `-E'.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--C
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-C}
-
-\end_inset
-
-Tell the preprocessor not to discard comments.
- Used with the `-E' option.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--MM
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-MM}
-
-\end_inset
-
-Like `-M' but the output mentions only the user header files included with
- `#include file"'.
- System header files included with `#include <file>' are omitted.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--Aquestion(answer)
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-Aquestion(answer)}
-
-\end_inset
-
- Assert the answer answer for question, in case it is tested with a preprocessor
- conditional such as `#if #question(answer)'.
- `-A-' disables the standard asser- tions that normally describe the target
- machine.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--Aquestion
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-Aquestion}
-
-\end_inset
-
- (answer) Assert the answer answer for question, in case it is tested with
- a preprocessor conditional such as `#if #question(answer)'.
- `-A-' disables the standard assertions that normally describe the target
- machine.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--Umacro
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-Umacro}
-
-\end_inset
-
- Undefine macro macro.
- `-U' options are evaluated after all `-D' options, but before any `-include'
- and `-imac- ros' options.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--dM
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-dM}
-
-\end_inset
-
- Tell the preprocessor to output only a list of the mac- ro definitions
- that are in effect at the end of prepro- cessing.
- Used with the `-E' option.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--dD
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-dD}
-
-\end_inset
-
-Tell the preprocessor to pass all macro definitions into the output, in
- their proper sequence in the rest of the output.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--dN
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-dN}
-
-\end_inset
-
-Like `-dD' except that the macro arguments and contents are omitted.
- Only `#define name' is included in the output.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
--S
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{-S}
-
-\end_inset
-
-Stop after the stage of compilation proper; do not as- semble.
- The output is an assembler code file for the input file specified.
-\layout Itemize
-
-
-\series bold
-\bar under
--Wa asmOption[,asmOption]
-\series default
-\bar default
-...
- Pass the asmOption to the assembler
-\layout Itemize
-
-
-\series bold
-\bar under
--Wl linkOption[,linkOption]
-\series default
-\bar default
- ..
- Pass the linkOption to the linker.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---int-long-reent
-\series default
-\bar default
-
-\size default
-
-\begin_inset LatexCommand \label{--int-long-rent}
-
-\end_inset
-
- Integer (16 bit) and long (32 bit) libraries have been compiled as reentrant.
- Note by default these libraries are compiled as non-reentrant.
- See section Installation for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---cyclomatic
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--cyclomatic}
-
-\end_inset
-
-This option will cause the compiler to generate an information message for
- each function in the source file.
- The message contains some
-\emph on
-important
-\emph default
- information about the function.
- The number of edges and nodes the compiler detected in the control flow
- graph of the function, and most importantly the
-\emph on
-cyclomatic complexity
-\emph default
- see section on Cyclomatic Complexity for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---float-reent
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--float-reent}
-
-\end_inset
-
- Floating point library is compiled as reentrant.See section Installation
- for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---out-fmt-ihx
-\size default
-
-\begin_inset LatexCommand \label{--out-fmt-ihx}
-
-\end_inset
-
-
-\series default
-\bar default
-The linker output (final object code) is in Intel Hex format.
- (This is the default option).
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---out-fmt-s19
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--out-fmt-s19}
-
-\end_inset
-
-The linker output (final object code) is in Motorola S19 format.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---nooverlay
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--nooverlay}
-
-\end_inset
-
- The compiler will not overlay parameters and local variables of any function,
- see section Parameters and local variables for more details.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---main-return
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--main-return}
-
-\end_inset
-
- This option can be used when the code generated is called by a monitor
- program.
- The compiler will generate a 'ret' upon return from the 'main' function.
- The default option is to lock up i.e.
- generate a 'ljmp .' .
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---no-peep
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--no-peep}
-
-\end_inset
-
- Disable peep-hole optimization.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---peep-asm
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--peep-asm}
-
-\end_inset
-
- Pass the inline assembler code through the peep hole optimizer.
- Can cause unexpected changes to inline assembler code , please go through
- the peephole optimizer rules defnied in file 'SDCCpeeph.def' before using
- this option.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---iram-size
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--iram-size}
-
-\end_inset
-
- <Value> Causes the linker to check if the interal ram usage is within limits
- of the given value.
-\layout Standard
-
-The following options are provided for the purpose of retargetting and debugging
- the compiler .
- These provided a means to dump the intermediate code (iCode) generated
- by the compiler in human readable form at various stages of the compilation
- process.
-
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumpraw
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--dumpraw}
-
-\end_inset
-
-.
- This option will cause the compiler to dump the intermediate code into
- a file of named
-\emph on
-<source filename>.dumpraw
-\emph default
- just after the intermediate code has been generated for a function , i.e.
- before any optimizations are done.
- The basic blocks at this stage ordered in the depth first number, so they
- may not be in sequence of execution.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumpgcse
-\series default
-\bar default
-.
-\size default
-
-\begin_inset LatexCommand \label{--dumpgcse}
-
-\end_inset
-
- Will create a dump if iCode, after global subexpression elimination, into
- a file named
-\emph on
-<source filename>.dumpgcse.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumpdeadcode
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--dumpdeadcode}
-
-\end_inset
-
-.Will create a dump if iCode, after deadcode elimination, into a file named
-
-\emph on
-<source filename>.dumpdeadcode.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumploop.
-
-\series default
-\bar default
-
-\size default
-
-\begin_inset LatexCommand \label{--dumploop}
-
-\end_inset
-
-Will create a dump if iCode, after loop optimizations, into a file named
-
-\emph on
-<source filename>.dumploop.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumprange.
-
-\series default
-\bar default
-
-\size default
-
-\begin_inset LatexCommand \label{--dump-range}
-
-\end_inset
-
-Will create a dump if iCode, after live range analysis, into a file named
-
-\emph on
-<source filename>.dumprange.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumpregassign.
-
-\size default
-
-\series default
-\bar default
-
-\begin_inset LatexCommand \label{--dumpregassign}
-
-\end_inset
-
-Will create a dump if iCode, after register assignment , into a file named
-
-\emph on
-<source filename>.dumprassgn.
-\layout Itemize
-
-
-\series bold
-\size large
-\bar under
---dumpall.
-
-\series default
-\size default
-\bar default
-
-\begin_inset LatexCommand \label{--dumpall}
-
-\end_inset
-
-Will cause all the above mentioned dumps to be created.
-\layout Standard
-
-Note that the files created for the dump are appended to each time.
- So the files should be deleted manually , before each dump is created.
-
-\layout Standard
-
-When reporting bugs, it will be very helpful if you could include these
- dumps along with the portion of the code that is causing the problem.
-\layout Section
-
-Language Extensions
-\begin_inset LatexCommand \label{Language Extension}
-
-\end_inset
-
-
-\layout Subsection
-
-Storage Classes.
-\begin_inset LatexCommand \label{Storage Classes}
-
-\end_inset
-
-
-\layout Standard
-
-In addition to the ANSI storage classes SDCC allows the following 8051 specific
- storage classes.
-\layout Subsubsection
-
-xdata.
-\begin_inset LatexCommand \label{xdata}
-
-\end_inset
-
-
-\layout Standard
-
-Variables declared with this storage class will be placed in the extern
- RAM.
- This is the
-\series bold
-default
-\series default
- storage class for Large Memory model .
-\layout Standard
-
-
-\size footnotesize
-eg.
-
-\emph on
-xdata unsigned char xduc;
-\layout Subsubsection
-
-data
-\begin_inset LatexCommand \label{data}
-
-\end_inset
-
-
-\layout Standard
-
-This is the
-\series bold
-default
-\series default
- storage class for Small Memory model.
- Variables declared with this storage class will be allocated in the internal
- RAM.
-\layout Standard
-
-
-\size footnotesize
-eg.
-
-\emph on
- data int iramdata;
-\layout Subsubsection
-
-idata
-\begin_inset LatexCommand \label{idata}
-
-\end_inset
-
-
-\layout Standard
-
-Variables declared with this storage class will be allocated into the indirectly
- addressable portion of the internal ram of a 8051 .
-\layout Standard
-
-
-\size footnotesize
-eg.
-\emph on
-idata int idi;
-\layout Subsubsection
-
-bit
-\begin_inset LatexCommand \label{bit}
-
-\end_inset
-
-
-\layout Standard
-
-This is a data-type and a storage class specifier.
- When a variable is declared as a bit , it is allocated into the bit addressable
- memory of 8051.
-\layout Standard
-
-eg.
-\emph on
-bit iFlag;
-\layout Subsubsection
-
-sfr / sbit
-\begin_inset LatexCommand \label{sfr / sbit}
-
-\end_inset
-
-
-\layout Standard
-
-Like the bit keyword,
-\emph on
-sfr / sbit
-\emph default
-signifies both a data-type and storage class, they are used to describe
- the special function registers and special bit variables of a 8051.
-
-\layout Standard
-
-eg.
-
-\emph on
-
-\layout Standard
-
-
-\emph on
-sfr at 0x80 P0;
-\emph default
-\noun on
-/* special function register P0 at location 0x80 */
-\layout Standard
-
-
-\emph on
-sbit at 0xd7 CY; /*
-\noun on
-CY (Carry Flag) */
-\layout Section
-
-Optimizations
-\begin_inset LatexCommand \label{Optimizations}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC performs a a host of standard optimizations in addition to some MCU
- specific optimizations.
-
-\layout Subsection
-
-Sub-expression elimination
-\begin_inset LatexCommand \label{Sub-expression Elimination}
-
-\end_inset
-
-
-\layout Standard
-
-The compiler does
-\emph on
-local and global
-\emph default
-common subexpression elimination.
-\layout Standard
-
-
-\family typewriter
-\size scriptsize
-eg.
-
-\layout Standard
-
-
-\size small
-i = x + y + 1;
-\size default
-
-\newline
-j
-\size small
-= x + y;
-\layout Standard
-
-will be translated to
-\layout Standard
-
-
-\size small
-iTemp = x + y
-\newline
-i = iTemp + 1
-\newline
-j = iTemp
-\layout Standard
-
-Some subexpressions are not as obvious as the above example.
-\layout Standard
-
-eg.
-\layout Standard
-
-
-\size small
-a->b[i].c = 10;
-\newline
-a->b[i].d = 11;
-\layout Standard
-
-In this case the address arithmetic
-\emph on
-a->b[i]
-\emph default
-will be computed only once; the equivalent code in C would be.
-\layout Standard
-
-
-\size small
-iTemp = a->b[i];
-\newline
-iTemp.c = 10;
-\newline
-iTemp.d = 11;
-\layout Standard
-
-The compiler will try to keep these temporary variables in registers.
-\layout Subsection
-
-Dead-Code elimination.
-\begin_inset LatexCommand \label{Dead-code elimination}
-
-\end_inset
-
-
-\layout Standard
-
-eg.
-\layout Standard
-
-
-\size small
-int global;
-\newline
-void f () {
-\newline
-
-\protected_separator
-
-\protected_separator
-int i;
-\newline
-
-\protected_separator
-
-\protected_separator
-i = 1;
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-/* dead store */
-\newline
-
-\protected_separator
-
-\protected_separator
-global = 1; /* dead store */
-\newline
-
-\protected_separator
-
-\protected_separator
-global = 2;
-\newline
-
-\protected_separator
-
-\protected_separator
-return;
-\newline
-
-\protected_separator
-
-\protected_separator
-global = 3; /* unreachable */
-\newline
-}
-\layout Standard
-
-will be changed to
-\layout Standard
-
-
-\size footnotesize
-int global; void f ()
-\newline
-{
-\protected_separator
-
-\protected_separator
-
-\newline
-
-\protected_separator
-global = 2;
-\protected_separator
-
-\protected_separator
-
-\newline
-
-\protected_separator
-return;
-\newline
-}
-\layout Subsection
-
-Copy-Propagation:
-\begin_inset LatexCommand \label{Copy-Propagation}
-
-\end_inset
-
-
-\layout Standard
-
-eg.
-\layout Standard
-
-
-\size footnotesize
-int f() {
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-int i, j;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-i = 10;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-j = i;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-return j;
-\newline
-}
-\layout Standard
-
-will be changed to
-\layout Standard
-
-
-\size small
-int f() {
-\newline
-
-\protected_separator
-
-\protected_separator
- int i,j;
-\newline
-
-\protected_separator
-
-\protected_separator
- i = 10;
-\newline
-
-\protected_separator
-
-\protected_separator
- j = 10;
-\newline
-
-\protected_separator
-
-\protected_separator
- return 10;
-\newline
-}
-\layout Standard
-
-Note: the dead stores created by this copy propagation will be eliminated
- by dead-code elimination .
-\layout Subsection
-
-Loop optimizations
-\begin_inset LatexCommand \label{Loop Optimizations}
-
-\end_inset
-
-
-\layout Standard
-
-Two types of loop optimizations are done by SDCC loop invariant lifting
- and strength reduction of loop induction variables.In addition to the strength
- reduction the optimizer marks the induction variables and the register
- allocator tries to keep the induction variables in registers for the duration
- of the loop.
- Because of this preference of the register allocator , loop induction optimizat
-ion causes an increase in register pressure, which may cause unwanted spilling
- of other temporary variables into the stack / data space .
- The compiler will generate a warning message when it is forced to allocate
- extra space either on the stack or data space.
- If this extra space allocation is undesirable then induction optimization
- can be eliminated either for the entire source file ( with --noinduction
- option) or for a given function only (#pragma NOINDUCTION).
-\layout Subsubsection
-
-Loop Invariant:
-\begin_inset LatexCommand \label{Loop Invariant}
-
-\end_inset
-
-
-\layout Standard
-
-eg
-\layout Standard
-
-
-\size small
-for (i = 0 ; i < 100 ; i ++)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-f += k + l;
-\layout Standard
-
-changed to
-\layout Standard
-
-
-\size small
-itemp = k + l;
-\newline
-for ( i = 0; i < 100; i++ ) f += itemp;
-\layout Standard
-
-As mentioned previously some loop invariants are not as apparent, all static
- address computations are also moved out of the loop.
-\layout Subsubsection
-
-Strength reduction :
-\begin_inset LatexCommand \label{Strength Reduction}
-
-\end_inset
-
-
-\layout Standard
-
-This optimization substitutes an expression by a cheaper expression.
-\layout Standard
-
-eg.
-\layout Standard
-
-
-\size small
-for (i=0;i < 100; i++) ar[i*5] = i*3;
-\layout Standard
-
-changed to
-\layout Standard
-
-
-\size small
-itemp1 = 0;
-\newline
-itemp2 = 0;
-\newline
-for (i=0;i< 100;i++) {
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-ar[itemp1] = itemp2;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-itemp1 += 5;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-itemp2 += 3;
-\newline
-}
-\layout Standard
-
-The more expensive multiplication is changed to a less expensive addition.
-\layout Subsubsection
-
-Loop reversing:
-\begin_inset LatexCommand \label{Loop reversing}
-
-\end_inset
-
-
-\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
-\begin_inset Quotes eld
-\end_inset
-
-decrement and jump if not zero
-\begin_inset Quotes erd
-\end_inset
-
- instruction.
- SDCC checks for the following criterion to determine if a loop is reversible
- (note: more sophisticated compiers use data-dependency analysis to make
- this determination, SDCC uses a more simple minded analysis).
-\layout Itemize
-
-The 'for' loop is of the form
-\newline
-
-\begin_inset Quotes eld
-\end_inset
-
-for ( <symbol> = <expression> ; <sym> [< | <=] <expression> ; [<sym>++ |
- <sym> += 1])
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-<for body>
-\begin_inset Quotes erd
-\end_inset
-
-
-\layout Itemize
-
-The <for body> does not contain
-\begin_inset Quotes eld
-\end_inset
-
-continue
-\begin_inset Quotes erd
-\end_inset
-
- or 'break
-\begin_inset Quotes erd
-\end_inset
-
-.
-\layout Itemize
-
-All goto's are contained within the loop.
-\layout Itemize
-
-No function calls within the loop.
-\layout Itemize
-
-The loop control variable <sym> is not assigned any value within the loop
-\layout Itemize
-
-The loop control variable does NOT participate in any arithmetic operation
- within the loop.
-\layout Itemize
-
-There are NO switch statements in the loop.
-\layout Standard
-
-Note djnz instruction can be used for 8-bit values ONLY, therefore it is
- advantageous to declare loop control symbols as either 'char' or 'short',
- ofcourse this may not be possible on all situations.
-\layout Subsection
-
-Algebraic simplifications:
-\begin_inset LatexCommand \label{Algebraic Simplifications}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC does numerous algebraic simplifications, the following is a small sub-set
- of these optimizations.
-\layout Standard
-
-
-\size small
-eg
-\emph on
-
-\emph default
-
-\newline
-i = j + 0 ; /* changed to */ i = j;
-\newline
-i /= 2; /* changed to */ i >>= 1;
-\newline
-i = j - j ; /* changed to */ i = 0;
-\newline
-i = j / 1 ; /* changed to */ i = j;
-\layout Standard
-
-Note the subexpressions given above are generally introduced by macro expansions
- or as a result of copy/constant propagation.
-\layout Subsection
-
-'switch' statements.
-\begin_inset LatexCommand \label{Switch Statement}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC changes switch statements to jump tables when the following conditions
- are true.
-
-\layout Itemize
-
-The case labels are in numerical sequence , the labels need not be in order,
- and the starting number need not be one or zero.
-\layout Standard
-
-eg
-\layout Standard
-
-
-\size small
-switch(i) {
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-switch (i) {
-\newline
-case 4:...
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-case 1: ...
-
-\newline
-case 5:...
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-case 2: ...
-
-\newline
-case 3:...
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-case 3: ...
-
-\newline
-case 6:...
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-case 4: ...
-
-\newline
-}
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-}
-\layout Standard
-
-Both the above switch statements will be implemented using a jump-table.
-\layout Itemize
-
-The number of case labels is at least three, since it takes two conditional
- statements to handle the boundary conditions.
-\layout Itemize
-
-The number of case labels is less than 84, since each label takes 3 bytes
- and a jump-table can be utmost 256 bytes long.
-
-\layout Standard
-
-Switch statements which have gaps in the numeric sequence or those that
- have more that 84 case labels can be split into more than one switch statement
- for efficient code generation.
-\layout Standard
-
-eg
-\layout Standard
-
-
-\size small
-switch (i) {
-\newline
-case 1: ...
-
-\newline
-case 2: ...
-
-\newline
-case 3: ...
-
-\newline
-case 4: ...
-
-\newline
-case 9: ...
-
-\newline
-case 10: ...
-
-\newline
-case 11: ...
-
-\newline
-case 12: ...
-
-\newline
-}
-\layout Standard
-
-If the above switch statement is broken down into two switch statements
-\layout Standard
-
-
-\size small
-switch (i) {
-\newline
-case 1: ...
-
-\newline
-case 2: ...
-
-\newline
-case 3: ...
-
-\newline
-case 4: ...
-
-\newline
-}
-\layout Standard
-
-
-\size small
-switch (i) {
-\newline
-case 9: ...
-
-\newline
-case 10: ...
-
-\newline
-case 11: ...
-
-\newline
-case 12:...
-
-\newline
-}
-\layout Standard
-
-then both the switch statements will be implemented using jump-tables whereas
- the unmodified switch statement will not be .
-\layout Subsection
-
-bit-shifting operations.
-\begin_inset LatexCommand \label{bit shifting}
-
-\end_inset
-
-
-\layout Standard
-
-Bit shifting is one of the most frequently used operation in embedded programmin
-g .
- SDCC tries to implement bit-shift operations in the most efficient way
- possible.
-\layout Standard
-
-eg.
-\layout Standard
-
-
-\size small
-unsigned short i;
-\layout Standard
-
-
-\size small
-...
-
-\newline
-i>>= 4;
-\newline
-..
-\layout Standard
-
-generates the following code.
-\layout Standard
-
-
-\size small
-mov a,_i
-\newline
-swap a
-\newline
-anl a,#0x0f
-\newline
-mov _i,a
-\layout Standard
-
-In general SDCC will never setup a loop if the shift count is known.
- Another example
-\layout Standard
-
-
-\size small
-unsigned int i;
-\newline
-...
-
-\newline
-i >>= 9;
-\newline
-...
-\layout Standard
-
-will generate
-\layout Standard
-
-
-\size small
-mov a,(_i + 1)
-\newline
-mov (_i + 1),#0x00
-\newline
-clr c
-\newline
-rrc a
-\newline
-mov _i,a
-\layout Standard
-
-Note that SDCC stores numbers in
-\noun on
-little-endian
-\noun default
-format (i.e.
- lowest order first)
-\layout Subsubsection
-
-Bit-rotation:
-\begin_inset LatexCommand \label{bit rotation}
-
-\end_inset
-
-
-\layout Standard
-
-A special case of the bit-shift operation is bit rotation, SDCC recognizes
- the following expression to be a left bit-rotation.
-\layout Standard
-
-
-\size small
-unsigned char i;
-\newline
-...
-
-\newline
-i = ( ( i << 1) | ( i >> 7));
-\newline
-...
-\layout Standard
-
-will generate the following code.
-\layout Standard
-
-
-\size small
-mov a,_i
-\newline
-rl a
-\newline
-mov _i,a
-\layout Standard
-
-SDCC uses pattern matching on the parse tree to determine this operation
- .Variations of this case will also be recognized as bit-rotation i.e
-\emph on
- i = ((i >> 7) | (i << 1));
-\emph default
-/* left-bit rotation */
-\layout Subsection
-
-Highest Order Bit.
-\begin_inset LatexCommand \label{Highest Order Bit}
-
-\end_inset
-
-
-\layout Standard
-
-It is frequently required to obtain the highest order bit of an integral
- type (int,long,short or char types).
- SDCC recognizes the following expression to yield the highest order bit
- and generates optimized code for it.
-\layout Standard
-
-
-\size small
-eg
-\newline
-unsigned int gint;
-\newline
-foo () {
-\newline
-unsigned char hob;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-...
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-hob = (gint >> 15) & 1;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-..
-
-\newline
-}
-\layout Standard
-
-Will generate the following code.
-\layout Standard
-
-
-\size small
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 61 ;
-\protected_separator
- hob.c 7
-\newline
-
-\protected_separator
-
-\protected_separator
- 000A E5*01
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 62
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- a,(_gint + 1)
-\newline
-
-\protected_separator
-
-\protected_separator
- 000C 33
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 63
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- rlc
-\protected_separator
- a
-\newline
-
-\protected_separator
-
-\protected_separator
- 000D E4
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 64
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- clr
-\protected_separator
- a
-\newline
-
-\protected_separator
-
-\protected_separator
- 000E 13
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 65
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- rrc
-\protected_separator
- a
-\newline
-
-\protected_separator
-
-\protected_separator
- 000F F5*02
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 66
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- _foo_hob_1_1,a
-\layout Standard
-
-Variations of this case however will NOT be recognized .
- It is a standard C expression , so I heartily recommend this be the only
- way to get the highest order bit, (it is portable).
- Of course it will be recognized even if it is embedded in other expressions.
-\layout Standard
-
-
-\size small
-eg.
-\layout Standard
-
-
-\size small
-xyz = gint + ((gint >> 15) & 1);
-\layout Standard
-
-will still be recognized.
-\layout Subsection
-
-Peep-hole optimizer.
-\begin_inset LatexCommand \label{Peep-Hole}
-
-\end_inset
-
-
-\layout Standard
-
-The compiler uses a rule based , pattern matching and re-writing mechanism
- for peep-hole optimization .
- It is inspired by '
-\emph on
-copt'
-\emph default
- a peep-hole optimizer by Christopher W.
- Fraser (cwfraser@microsoft.com).
- A default set of rules are compiled into the compiler, additional rules
- may be added with the --peep-file <filename> option.
- The rule language is best illustrated with examples.
-\layout Standard
-
-
-\size small
-replace {
-\newline
-mov %1,a
-\newline
-mov a,%1 } by { mov %1,a }
-\layout Standard
-
-The above rule will the following assembly sequence
-\layout Standard
-
-
-\size small
-mov r1,a
-\newline
-mov a,r1
-\layout Standard
-
-to
-\layout Standard
-
-
-\size small
-mov r1,a
-\layout Standard
-
-Note: All occurrences of a '%n' ( pattern variable ) must denote the same
- string.
- With the above rule, the assembly sequence
-\layout Standard
-
-
-\size small
-mov r1,a
-\newline
-mov a,r2
-\layout Standard
-
-will remain unmodified.
- Other special case optimizations may be added by the user (via --peep-file
- option), eg.
- some variants of the 8051 MCU allow only 'AJMP' and 'ACALL' , the following
- two rules will change all 'LJMP' & 'LCALL' to 'AJMP' & 'ACALL'.
-\layout Standard
-
-
-\size small
-replace { lcall %1 } by { acall %1 }
-\newline
-replace { ljmp %1 } by { ajmp %1 }
-\layout Standard
-
-The inline-assembler' code is also passed through the peep hole optimizer,
- thus the peephole optimizer can also be used as an assembly level macro
- expander.
- The rules themselves are MCU dependent whereas the rule language infra-structur
-e is MCU independent.
- Peephole optimization rules for other MCU can be easily programmed using
- the rule language.
-\layout Standard
-
-The syntax for a rule is as follows ,
-\layout Standard
-
-
-\size small
-rule := replace [ restart ] '{' <assembly sequence> '
-\backslash
-n'
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- '}' by '{' '
-\backslash
-n'
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- <assembly sequence> '
-\backslash
-n'
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- '}' [if <functionName> ] '
-\backslash
-n'
-\newline
-<assembly sequence> := assembly instruction (each instruction including
- labels must be on a separate line).
-\protected_separator
-
-\protected_separator
-
-\layout Standard
-
-The optimizer will apply to the rules one by one from the top in the sequence
- of their appearance, it will terminate when all rules are exhausted.
- If the '
-\emph on
-restart
-\emph default
-' option is specified, then the optimizer will start matching the rules
- again from the top, this option for a rule is expensive (performance),
- it is intended to be used in situations where a transformation will trigger
- the same rule again.
- A good example of this the following rule.
-\layout Standard
-
-
-\size small
-replace restart {
-\newline
-pop %1
-\newline
-push %1 } by {
-\newline
-; nop
-\newline
-}
-\layout Standard
-
-Note that the replace pattern cannot be a blank, but can be a comment line.
- Without the '
-\emph on
-restart
-\emph default
-' option only the inner most 'pop' 'push' pair would be eliminated.
- i.e.
-\layout Standard
-
-
-\size small
-pop ar1
-\newline
-pop ar2
-\newline
-push ar2
-\newline
-push ar1
-\layout Standard
-
-would result in
-\layout Standard
-
-
-\size small
-pop ar1
-\newline
-; nop
-\newline
-push ar1
-\layout Standard
-
-with the '
-\emph on
-restart
-\emph default
-' option the rule will be applied again to the resulting code and the all
- the '
-\emph on
-pop' 'push'
-\emph default
- pairs will be eliminated to yield
-\layout Standard
-
-
-\size small
-; nop
-\newline
-; nop
-\layout Standard
-
-A conditional function can be attached to a rule.
- Attaching rules are somewhat more involved, let me illustrate this with
- an example.
-\layout Standard
-
-
-\size small
-replace {
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-ljmp %5
-\newline
-%2:} by {
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-sjmp %5
-\newline
-%2:} if labelInRange
-\layout Standard
-
-The optimizer does a look-up of a function name table defined in function
- '
-\emph on
-callFuncByName'
-\emph default
- in the source file
-\emph on
-SDCCpeeph.c
-\emph default
- , 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
- case the use of
-\emph on
-'%5
-\emph default
-' is crucial, since the function
-\emph on
-labelInRange
-\emph default
- expects to find the label in that particular variable (the hash table containin
-g the variable bindings is passed as a parameter).
- If you want to code more such functions , take a close look at the function
-
-\emph on
-labelInRange
-\emph default
- and the calling mechanism in source file
-\emph on
-SDCCpeeph.c
-\emph default
-.
- I know this whole thing is a little kludgey , may be some day we will have
- some better means.
- If you are looking at this file, you will also see the default rules that
- are compiled into the compiler, you can your own rules in the default set
- there if you get tired of specifying the
-\emph on
---peep-file
-\emph default
- option.
-\layout Section
-
-Pointers
-\begin_inset LatexCommand \label{Pointers}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC allows (via language extensions) pointers to explicitly point to any
- of the memory spaces of the 8051.
- In addition to the explicit pointers, the compiler also allows a
-\emph on
-_generic
-\emph default
- class of pointers which can be used to point to any of the memory spaces.
-
-\layout Standard
-
-Pointer declaration examples.
-\layout Standard
-
-
-\size small
-/* pointer physically in xternal ram pointing to object in internal ram
- */
-\newline
-data unsigned char * xdata p;
-\newline
-
-\layout Standard
-
-
-\size small
-/* pointer physically in code rom pointing to data in xdata space */
-\newline
-xdata unsigned char * code p;
-\newline
-
-\layout Standard
-
-
-\size small
-/* pointer physically in code space pointing to data in code space */
-\newline
-code unsigned char * code p;
-\newline
-
-\newline
-/* the folowing is a generic pointer physically located in xdata space */
-\newline
-char * xdata p;
-\layout Standard
-
-Well you get the idea.
- For compatibility with the previous version of the compiler, the following
- syntax for pointer declaration is also supported.
- Note the above examples will be portable to other commercially available
- compilers.
-\layout Standard
-
-
-\size small
-unsigned char _xdata *ucxdp; /* pointer to data in external ram */
-\newline
-unsigned char _data
-\protected_separator
-*ucdp ; /* pointer to data in internal ram */
-\newline
-unsigned char _code
-\protected_separator
-*uccp ; /* pointer to data in R/O code space */
-\newline
-unsigned char _idata *uccp;
-\protected_separator
-/* pointer to upper 128 bytes of ram */
-\layout Standard
-
-All unqualified pointers are treated as 3 - byte '_generic' pointers.
- These type of pointers can also to be explicitly declared.
-\layout Standard
-
-
-\size small
-unsigned char _generic *ucgp;
-\layout Standard
-
-The highest order byte of the generic pointers contains the data space informati
-on.
- Assembler support routines are called whenever data is stored or retrieved
- using _generic pointers.
- These are useful for developing reusable library routines.
- Explicitly specifying the pointer type will generate the most efficient
- code.
- Pointers declared using a mixture of OLD/NEW style could have unpredictable
- results.
-\layout Section
-
-Parameters & Local Variables
-\begin_inset LatexCommand \label{Auto Variables}
-
-\end_inset
-
-
-\layout Standard
-
-Automatic (local) variables and parameters to functions can either be placed
- on the stack or in data-space.
- The default action of the compiler is to place these variables in the internal
- RAM ( for small model) or external RAM (for Large model).
- They can be placed on the stack either by using the
-\emph on
- --stack-auto
-\emph default
- compiler option or by using the 'reentrant' keyword in the function declaration.
-\layout Standard
-
-
-\family typewriter
-\size scriptsize
-eg
-\layout Standard
-
-
-\size small
-unsigned short foo( short i) reentrant {
-\newline
-...
-
-\newline
-}
-\layout Standard
-
-Note that when the parameters & local variables are declared in the internal/ext
-ernal ram the functions are non-reentrant.
- Since stack space on 8051 is limited the
-\emph on
-'reentrant'
-\emph default
-keyword or the
-\emph on
- --stack-auto
-\emph default
- option should be used sparingly.
- Note the reentrant keyword just means that the parameters & local variables
- will be allocated to the stack, it DOES NOT mean that the function is register
- bank independent.
-\layout Standard
-
-When compiled with the default option (i.e.
- non-reentrant ), local variables can be assigned storage classes and absolute
- addresses.
-
-\layout Standard
-
-
-\family typewriter
-\size scriptsize
-eg
-\layout Standard
-
-
-\size small
-unsigned short foo() {
-\newline
-
-\protected_separator
-
-\protected_separator
-xdata unsigned short i;
-\newline
-
-\protected_separator
-
-\protected_separator
-bit bvar;
-\newline
-
-\protected_separator
-
-\protected_separator
-data at 0x31 unsiged short j;
-\newline
-...
-
-\newline
-}
-\layout Standard
-
-In the above example the variable
-\emph on
-i
-\emph default
- will be allocated in the external ram,
-\emph on
-bvar
-\emph default
- in bit addressable space and
-\emph on
- j
-\emph default
- in internal ram.
- When compiled with the
-\emph on
---stack-auto
-\emph default
- or when a function is declared as
-\emph on
-'reentrant'
-\emph default
- local variables cannot be assigned storage classes or absolute addresses.
-\layout Standard
-
-Parameters however are not allowed any storage class, (storage classes for
- parameters will be ignored), their allocation is governed by the memory
- model in use , and the reentrancy options.
-\layout Subsection
-
-Overlaying
-\begin_inset LatexCommand \label{Overlaying}
-
-\end_inset
-
-
-\layout Standard
-
-For non-reentrant functions SDCC will try to reduce internal ram space usage
- by overlaying parameters and local variables of a function (if possible).
- Parameters and local variables of a function will be allocated to an overlayabl
-e segment if the function has
-\emph on
-no other function calls and the function is non-reentrant and the memory
- model is small.
-
-\emph default
- If an explicit storage class is specified for a local variable , it will
- NOT be overplayed.
-\layout Standard
-
-Note that the compiler (not the linkage editor) makes the decision for overlayin
-g the data items.
- Functions that are called from an interrupt service routine should be preceded
- by a #pragma NOOVERLAY if they are not reentrant Along the same lines the
- compiler does not do any processing with the inline assembler code so the
- compiler might incorrectly assign local variables and parameters of a function
- into the overlay segment if the only function call from a function is from
- inline assembler code, it is safe to use the #pragma NOOVERLAY for functions
- which call other functions using inline assembler code.
-\layout Standard
-
-Parameters and Local variables of functions that contain 16 or 32 bit multiplica
-tion or division will NOT be overlayed since these are implemented using
- external functions.
-\layout Standard
-
-eg.
-\layout Standard
-
-
-\size small
-#pragma SAVE
-\newline
-#pragma NOOVERLAY
-\newline
-void set_error( unsigned short errcd)
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
- P3 = errcd;
-\newline
-}
-\newline
-#pragma RESTORE
-\newline
-void some_isr () interrupt 2 using 1
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
- ...
-
-\newline
-
-\protected_separator
-
-\protected_separator
- set_error(10);
-\newline
-
-\protected_separator
-
-\protected_separator
- ...
-
-\newline
-}
-\layout Standard
-
-In the above example the parameter
-\emph on
-errcd
-\emph default
- for the function
-\emph on
-set_error
-\emph default
- would be assigned to the overlayable segment (if the #pragma NOOVERLAY
- was not present) , this could cause unpredictable runtime behavior.
- The pragma NOOVERLAY ensures that the parameters and local variables for
- the function are NOT overlayed.
-\layout Section
-
-critical Functions.
-\begin_inset LatexCommand \label{Critical}
-
-\end_inset
-
-
-\layout Standard
-
-A special keyword may be associated with a function declaring it as '
-\emph on
-critical
-\emph default
-'.
- SDCC will generate code to disable all interrupts upon entry to a critical
- function and enable them back before returning .
- Note that nesting critical functions may cause unpredictable results.
-\layout Standard
-
-eg
-\layout Standard
-
-
-\size small
-int foo () critical
-\newline
-{
-\newline
-...
-
-\newline
-...
-
-\newline
-}
-\layout Standard
-
-The critical attribute maybe used with other attributes like
-\emph on
-reentrant.
-\layout Section
-
-Absolute addressing.
-\begin_inset LatexCommand \label{Absolute Addressing}
-
-\end_inset
-
-
-\layout Standard
-
-Data items can be assigned an absolute address with the
-\emph on
-at <address>
-\emph default
- keyword, in addition to a storage class.
-\layout Standard
-
-eg.
-
-\layout Standard
-
-
-\size small
-xdata at 0x8000 unsigned char PORTA_8255 ;
-\layout Standard
-
-In the above example the
-\emph on
-PORTA_8255
-\emph default
- will be allocated to the location 0x8000 of the external ram.
-
-\layout Standard
-
-Note that is this feature is provided to give the programmer access to
-\emph on
-memory mapped
-\emph default
- devices attached to the controller.
- The compiler does not actually reserve any space for variables declared
- in this way (they are implemented with an equate in the assembler), thus
- it is left to the programmer to make sure there are no overlaps with other
- variables that are declared without the absolute address, the assembler
- listing file (.lst) and the linker output files (<filename>.rst) and (<filename>.m
-ap) are a good places to look for such overlaps.
-\layout Standard
-
-Absolute address can be specified for variables in all storage classes.
-\layout Standard
-
-
-\size small
-eg.
-\layout Standard
-
-
-\size small
-bit at 0x02 bvar;
-\layout Standard
-
-The above example will allocate the variable at offset 0x02 in the bit-addressab
-le space.
- There is no real advantage to assigning absolute addresses to variables
- in this manner , unless you want strict control over all the variables
- allocated.
-\layout Section
-
-Interrupt Service Routines
-\begin_inset LatexCommand \label{Interrupt Service Rouines}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC allows interrupt service routines to be coded in C, with some extended
- keywords.
-\layout Standard
-
-
-\size small
-void timer_isr (void) interrupt 2 using 1
-\newline
-{
-\newline
-..
-
-\newline
-}
-\layout Standard
-
-The number following the 'interrupt' keyword is the interrupt number this
- routine will service.
- The compiler will insert a call to this routine in the interrupt vector
- table for the interrupt number specified.
- The 'using' keyword is used to tell the compiler to use the specified register
- bank (8051 specific) when generating code for this function.
- Note that when some function is called from an interrupt service routine
- it should be preceded by a #pragma NOOVERLAY (if it is not reentrant) .
- A special note here, int (16 bit) and long (32 bit) integer division, multiplic
-ation & modulus operations are implemented using external support routines
- developed in ANSI-C, if an interrupt service routine needs to do any of
- these operations then the support routines (as mentioned in a following
- section) will have to recompiled using the --stack-auto option and the
- source file will need to be compiled using the --int-long-rent compiler
- option.
-\layout Standard
-
-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
- in the file that contains the function
-\emph on
-'main'
-\emph default
-.
-\layout Standard
-
-Interrupt Numbers and the corresponding address & descriptions for the Standard
- 8051 are listed below.
- SDCC will automatically adjust the interrupt vector table to the maximum
- interrupt number specified.
-\layout Standard
-
-Interrupt #
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-Description
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-Vector Address
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-External 0
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0x0003
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-1
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-Timer 0
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0x000B
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-2
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-External 1
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0x0013
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-3
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-Timer 1
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0x001B
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-4
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-Serial
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-0x0023
-\layout Standard
-
-If the interrupt service routine is defined without a register bank or with
- register bank 0 (using 0), the compiler will save the registers used by
- itself on the stack (upon entry and restore them at exit), however if such
- an interrupt service routine calls another function then the entire register
- bank will be saved on the stack.
- This scheme may be advantageous for small interrupt service routines which
- have low register usage.
-\layout Standard
-
-If the interrupt service routine is defined to be using a specific register
- bank then only
-\begin_inset Quotes eld
-\end_inset
-
-a
-\begin_inset Quotes erd
-\end_inset
-
-,
-\begin_inset Quotes erd
-\end_inset
-
-b
-\begin_inset Quotes erd
-\end_inset
-
- &
-\begin_inset Quotes eld
-\end_inset
-
-dptr
-\begin_inset Quotes erd
-\end_inset
-
- are save and restored, if such an interrupt service routine calls another
- function (using another register bank) then the entire register bank of
- the called function will be saved on the stack.
- This scheme is recommended for larger interrupt service routines.
-\layout Standard
-
-Calling other functions from an interrupt service routine is not recommended
- avoid it if possible.
-\layout Section
-
-Startup Code
-\begin_inset LatexCommand \label{Startup}
-
-\end_inset
-
-
-\layout Standard
-
-The compiler inserts a jump to the C routine
-\series bold
-_sdcc__external__startup()
-\series default
-at the start of the CODE area.
- This routine can be found in the file
-\series bold
-SDCCDIR/sdcc51lib/_startup.c
-\series default
- , by default this routine returns 0, if this routine returns a non-zero
- value , the static & global variable initialization will be skipped and
- the function main will be invoked, other wise static & global variables
- will be initialized before the function main is invoked.
-\layout Section
-
-Inline assembler code.
-\begin_inset LatexCommand \label{Inline}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC allows the use of in-line assembler with a few restriction as regards
- labels.
- All labels defined within inline assembler code HAS TO BE of the
-\emph on
-form nnnnn$
-\emph default
- where nnnn is a number less than 100 (which implies a limit of utmost 100
- inline assembler labels
-\noun on
-per function)
-\noun default
-.
- It is strongly recommended that each assembly instruction (including labels)
- be placed in a separate line ( as the example shows).
- When the
-\series bold
-\bar under
---peep-asm
-\series default
-\bar default
- command line option is used, the inline assembler code will be passed through
- the peephole optimizer, this might cause some unexpected changes in the
- inline assembler code, please go throught the peephole optimizer rules
- defined in file 'SDCCpeeph.def' carefully before using this option.
-\layout Standard
-
-
-\size small
-eg
-\layout Standard
-
-
-\size small
-_asm
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-mov b,#10
-\newline
-00001$:
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-djnz b,00001$
-\newline
-_endasm ;
-\layout Standard
-
-The inline assembler code can contain any valid code understood by the assembler
- (this includes any assembler directives and comment lines ) .
- The compiler does not do any validation of the code within the
-\emph on
-_asm ...
- _endasm;
-\emph default
- keyword pair.
-
-\layout Standard
-
-Inline assembler code cannot reference any C-Labels however it can reference
- labels defined by the inline assembler.
-\layout Standard
-
-
-\size small
-eg
-\layout Standard
-
-
-\size small
-foo() {
-\newline
-...
- /* some c code */
-\newline
-_asm
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-; some assembler code
-\newline
-
-\protected_separator
-
-\protected_separator
- ljmp $0003
-\newline
-_endasm ;
-\newline
-...
- /* some more c code */
-\newline
-clabel:
-\protected_separator
- /* inline assembler cannot reference this label */
-\newline
-_asm
-\newline
-
-\protected_separator
-
-\protected_separator
-$0003: ;label (can be reference by inline assembler only)
-\newline
-_endasm ;
-\newline
-...
-
-\newline
-}
-\layout Standard
-
-In other words inline assembly code can access labels defined in inline
- assembly.
- The same goes the other way, ie.
- labels defines in inline assembly CANNOT be accessed by C statements.
-\layout Section
-
-int (16 bit) and long (32 bit ) support.
-\begin_inset LatexCommand \label{int and long}
-
-\end_inset
-
-
-\layout Standard
-
-For signed & unsigned int (16 bit) and long (32 bit) variables, division,
- multiplication and modulus operations are implemented by support routines.
- These support routines are all developed in ANSI-C to facilitate porting
- to other MCUs.
- The following files contain the described routine, all of them can be found
- in the directory SDCCDIR/sdcc51lib
-\layout Itemize
-
-
-\size footnotesize
-_mulsint.c - signed 16 bit multiplication (calls _muluint)
-\layout Itemize
-
-
-\size footnotesize
-_muluint.c - unsigned 16 bit multiplication
-\layout Itemize
-
-
-\size footnotesize
-_divsint.c - signed 16 bit division (calls _divuint)
-\layout Itemize
-
-
-\size footnotesize
-_divuint.c - unsigned 16 bit division.
-\layout Itemize
-
-
-\size footnotesize
-_modsint.c - signed 16 bit modulus (call _moduint)
-\layout Itemize
-
-
-\size footnotesize
-_moduint.c - unsigned 16 bit modulus.
-\layout Itemize
-
-
-\size footnotesize
-_mulslong.c - signed 32 bit multiplication (calls _mululong)
-\layout Itemize
-
-
-\size footnotesize
-_mululong.c - unsigned32 bit multiplication.
-\layout Itemize
-
-
-\size footnotesize
-_divslong.c - signed 32 division (calls _divulong)
-\layout Itemize
-
-
-\size footnotesize
-_divulong.c - unsigned 32 division.
-\layout Itemize
-
-
-\size footnotesize
-_modslong.c - signed 32 bit modulus (calls _modulong).
-\layout Itemize
-
-
-\size footnotesize
-_modulong.c - unsigned 32 bit modulus.
-\layout Standard
-
-All these routines are compiled as non-reentrant and small model.
- Since they are compiled as non-reentrant, interrupt service routines should
- not do any of the above operations, if this unavoidable then the above
- routines will need to ne compiled with the --stack-auto option, after which
- the source program will have to be compiled with --int-long-rent option.
-\layout Section
-
-Floating point support
-\begin_inset LatexCommand \label{Float}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC supports IEEE (single precision 4bytes) floating point numbers.The floating
- point support routines are derived from gcc's floatlib.c and consists of
- the following routines.
-
-\layout Itemize
-
-
-\size footnotesize
-_fsadd.c - add floating point numbers.
-\layout Itemize
-
-
-\size footnotesize
-_fssub.c - subtract floating point numbers
-\layout Itemize
-
-
-\size footnotesize
-_fsdiv.c - divide floating point numbers
-\layout Itemize
-
-
-\size footnotesize
-_fsmul.c - multiply floating point numbers
-\layout Itemize
-
-
-\size footnotesize
-_fs2uchar.c - convert floating point to unsigned char
-\layout Itemize
-
-
-\size footnotesize
-_fs2char.c - convert floating point to signed char.
-\layout Itemize
-
-
-\size footnotesize
-_fs2uint.c - convert floating point to unsigned int.
-\layout Itemize
-
-
-\size footnotesize
-_fs2int.c - convert floating point to signed int.
-\layout Itemize
-
-
-\size footnotesize
-_fs2ulong.c - convert floating point to unsigned long.
-\layout Itemize
-
-
-\size footnotesize
-_fs2long.c - convert floating point to signed long.
-\layout Itemize
-
-
-\size footnotesize
-_uchar2fs.c - convert unsigned char to floating point
-\layout Itemize
-
-
-\size footnotesize
-_char2fs.c - convert char to floating point number
-\layout Itemize
-
-
-\size footnotesize
-_uint2fs.c - convert unsigned int to floating point
-\layout Itemize
-
-
-\size footnotesize
-_int2fs.c - convert int to floating point numbers
-\layout Itemize
-
-
-\size footnotesize
-_ulong2fs.c - convert unsigned long to floating point number
-\layout Itemize
-
-
-\size footnotesize
-_long2fs.c - convert long to floating point number.
-\layout Standard
-
-Note if all these routines are used simultaneously the data space might
- overflow.
- For serious floating point usage it is strongly recommended that the Large
- model be used (in which case the floating point routines mentioned above
- will need to recompiled with the --model-Large option)
-\layout Section
-
-Memory Models
-\begin_inset LatexCommand \label{Memory Models}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC allows two memory models for MCS51 code.
- Modules compiled with different memory models should be combined together,
- the results would be unpredictable.
- The support routines supplied with the compiler are compiled in small-model
- by default, and will need to be recompiled using the large model if the
- large model is used.
- In general the use of the large model is discouraged.
-\layout Standard
-
-When the large model is used all variables declared without a storage class
- will be allocated into the external ram, this includes all parameters and
- local variables (for non-reentrant functions).
- When the small model is used variables without storage class are allocated
- in the internal ram.
-\layout Standard
-
-Judicious usage of the processor specific storage classes and the 'reentrant'
- function type will yield much more efficient code, than using the large-model.
- Several optimizations are disabled when the program is compiled using the
- large model, it is therefore strongly recommdended that the small model
- be used unless absolutely required.
-\layout Section
-
-Flat 24 bit addressing model.
-\begin_inset LatexCommand \label{--model-flat24}
-
-\end_inset
-
-
-\layout Standard
-
-This option generates code for the 24 bit contiguous addressing mode of
- the Dallas DS80C390 part.
- In this mode, up to four meg of external RAM or code space can be directly
- addressed.
- See the data sheets at www.dalsemi.com for further information on this part.
-\layout Standard
-
-In older versions of the compiler, this option was used with the MCS51 code
- generator (-mmcs51).
- Now, however, the '390 has it's own code generator, selected by the -mds390
- switch.
- This code generator currently supports only the flat24 model, but the --model-f
-lat24 switch is still required, in case later versions of the code generator
- support other models (such as the paged mode of the '390).
- The combination of -mmcs51 and --model-flat24 is now depracated.
-\layout Standard
-
-Note that the compiler does not generate any code to place the processor
- into24 bitmode (it defaults to 8051 compatible mode).
- Boot loader or similar code must ensure that the processor is in 24 bit
- contiguous addressing mode before calling the SDCC startup code.
-\layout Standard
-
-Like the --model-large option, variables will by default be placed into
- the XDATA segment.
-
-\layout Standard
-
-Segments may be placed anywhere in the 4 meg address space using the usual
- --*-loc options.
- Note that if any segments are located above 64K, the -r flag must be passed
- to the linker to generate the proper segment relocations, and the Intel
- HEX output format must be used.
- The -r flag can be passed to the linker by using the option -Wl-r on the
- sdcc command line.
-\layout Standard
-
---stack-10bit:
-\layout Standard
-
-This option generates code for the 10 bit stack mode of the Dallas DS80C390
- part.
- In this mode, the stack is located in the lower 1K of the internal RAM,
- which is mapped to 0x400000.
-\layout Standard
-
-With this option, sdcc will generate the proper addressing for stack variables.
-\layout Standard
-
-Note that the support is incomplete, since it still uses a single byte as
- the stack pointer.
- This means that only the lower 256 bytes of the potential 1K stack space
- can actually be used.
- However, this does allow you to reclaim the precious 256 bytes of low RAM
- for use for the DATA and IDATA segments.
-\layout Standard
-
-The compiler will not generate any code to put the processor into 10 bit
- stack mode.
- It is important to ensure that the processor is in this mode before calling
- any re-entrant functions compiled with this option.
-\layout Standard
-
-In principle, this should work with the --stack-auto option, but that has
- not been tested.
- It is incompatible with the --xstack option.
- It also only makes sense if the processor is in 24 bit contiguous addressing
- mode (see the --model-flat24 option).
-\layout Section
-
-Defines created by the compiler.
-\begin_inset LatexCommand \label{Defines.}
-
-\end_inset
-
-
-\layout Standard
-
-The compiler creates the following #defines .
-\layout Itemize
-
-SDCC - this Symbol is always defined.
-\layout Itemize
-
-SDCC_STACK_AUTO - this symbol is defined when --stack-auto option is used.
-\layout Itemize
-
-SDCC_MODEL_SMALL - when small model is used.
-\layout Itemize
-
-SDCC_MODEL_LARGE - when --model-large is used.
-\layout Itemize
-
-SDCC_USE_XSTACK - when --xstack option is used.
-\layout Section
-
-Pragmas
-\begin_inset LatexCommand \label{Pragmaa}
-
-\end_inset
-
-
-\layout Standard
-
-SDCC supports the following
-\emph on
-#pragma
-\emph default
-directives.
- This directives are applicable only at a function level.
-\layout Itemize
-
-
-\series bold
-SAVE
-\series default
-
-\begin_inset LatexCommand \label{pragma save}
-
-\end_inset
-
- - this will save all the current options .
-\layout Itemize
-
-
-\series bold
-RESTORE
-\series default
-
-\begin_inset LatexCommand \label{pragma restore}
-
-\end_inset
-
-- will restore the saved options from the last save.
- Note that SAVES & RESTOREs cannot be nested.
- SDCC uses the same buffer to save the options each time a SAVE is called.
-\layout Itemize
-
-
-\series bold
-NOGCSE
-\series default
-
-\begin_inset LatexCommand \label{pragma nogcse}
-
-\end_inset
-
- - will stop global subexpression elimination.
-\layout Itemize
-
-
-\series bold
-NOINDUCTION
-\series default
-
-\begin_inset LatexCommand \label{pragma noinduction}
-
-\end_inset
-
-- will stop loop induction optimizations .
-\layout Itemize
-
-
-\series bold
-NOJTBOUND
-\series default
-
-\begin_inset LatexCommand \label{pragma nojtbound}
-
-\end_inset
-
-- will not generate code for boundary value checking , when switch statements
- are turned into jump-tables.
-\layout Itemize
-
-
-\series bold
-NOOVERLAY
-\series default
-
-\begin_inset LatexCommand \label{pragma nooverlay}
-
-\end_inset
-
-- the compiler will not overlay the parameters and local variables of a
- function.
-\layout Itemize
-
-
-\series bold
-NOLOOPREVERSE
-\series default
-
-\begin_inset LatexCommand \label{pragma noloopreverse}
-
-\end_inset
-
-- Will not do loop reversal optimization
-\layout Itemize
-
-
-\series bold
-EXCLUDE NONE | {acc[,b[,dpl[,dph]]]
-\series default
-
-\begin_inset LatexCommand \label{pragma exclude}
-
-\end_inset
-
- - The exclude pragma disables generation of pair of push/pop instruction
- in ISR function (using interrupt keyword).
- The directive should be placed immediately before the ISR function definition
- and it affects ALL ISR functions following it.
- To enable the normal register saving for ISR functions use
-\begin_inset Quotes eld
-\end_inset
-
-#pragma EXCLUDE none
-\begin_inset Quotes erd
-\end_inset
-
-
-\layout Itemize
-
-
-\series bold
-CALLEE-SAVES function1[,function2[,function3...]]
-\series default
-
-\begin_inset LatexCommand \label{pragma callee-saves}
-
-\end_inset
-
- - The compiler by default uses a caller saves convention for register saving
- across function calls, however this can cause unneccessary register pushing
- & popping when calling small functions from larger functions.
- This option can be used to switch the register saving convention for the
- function names specified.
- The compiler will not save registers when calling these functions, extra
- code will be generated at the entry & exit for these functions to save
- & restore the registers used by these functions, this can SUBSTANTIALLY
- reduce code & improve run time performance of the generated code.
- In future the compiler (with interprocedural analysis) will be able to
- determine the appropriate scheme to use for each function call.
- If --callee-saves
-\begin_inset LatexCommand \ref{--callee-saves}
-
-\end_inset
-
- command line option is used, the function names specified in #pragma CALLEE-SAV
-ES is appended to the list of functions specified inthe command line.
-\layout Standard
-
-The pragma's are intended to be used to turn-off certain optimizations which
- might cause the compiler to generate extra stack / data space to store
- compiler generated temporary variables.
- This usually happens in large functions.
- Pragma directives should be used as shown in the following example, they
- are used to control options & optimizations for a given function; pragmas
- should be placed
-\noun on
-before
-\noun default
- and/or
-\noun on
-after
-\noun default
- a function, placing pragma's inside a function body could have unpredictable
- results.
-\layout Standard
-
-
-\size scriptsize
-eg
-\layout Standard
-
-
-\size scriptsize
-#pragma SAVE
-\protected_separator
- /* save the current settings */
-\newline
-#pragma NOGCSE /* turnoff global subexpression elimination */
-\newline
-#pragma NOINDUCTION /* turn off induction optimizations */
-\newline
-int foo ()
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
- ...
-
-\newline
-
-\protected_separator
-
-\protected_separator
- /* large code */
-\newline
-
-\protected_separator
-
-\protected_separator
- ...
-
-\newline
-}
-\newline
-#pragma RESTORE /* turn the optimizations back on */
-\layout Standard
-
-The compiler will generate a warning message when extra space is allocated.
- It is strongly recommended that the SAVE and RESTORE pragma's be used when
- changing options for a function.
-\layout Section
-
-Library routines.
-\begin_inset LatexCommand \label{Library}
-
-\end_inset
-
-
-\layout Standard
-
-The following library routines are provided for your convenience.
-\layout Standard
-
-
-\series bold
-\size large
-stdio.h
-\series default
-\size default
-- Contains the following functions printf & sprintf these routines are developed
- by
-\emph on
-Martijn van Balen <balen@natlab.research.philips.com>.
-
-\layout Standard
-
-
-\size scriptsize
-%[flags][width][b|B|l|L]type
-\layout Standard
-
-
-\size scriptsize
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- flags: -
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- left justify output in specified field width
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- +
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- prefix output with +/- sign if output is signed type
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- space
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- prefix output with a blank if it's a signed positive value
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- width:
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- specifies minimum number of characters outputted for numbers
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- or strings.
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- - For numbers, spaces are added on the left when needed.
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- If width starts with a zero character, zeroes and used
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- instead of spaces.
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- - For strings, spaces are are added on the left or right (when
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- flag '-' is used) when needed.
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- b/B:
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- byte argument (used by d, u, o, x, X)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- l/L:
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- long argument (used by d, u, o, x, X)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- type:
-\protected_separator
- d
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- decimal number
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- u
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- unsigned decimal number
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- o
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- unsigned octal number
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- x
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- unsigned hexadecimal number (0-9, a-f)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- X
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- unsigned hexadecimal number (0-9, A-F)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- c
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- character
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- s
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- string (generic pointer)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- p
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- generic pointer (I:data/idata, C:code, X:xdata, P:paged)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- f
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- float (still to be implemented)
-\layout Standard
-
-Also contains a very simple version of printf (
-\series bold
-printf_small
-\series default
-).
- This simplified version of printf supports only the following formats.
-\layout Standard
-
-
-\size scriptsize
-\bar under
-format
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-output
-\protected_separator
-type
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-argument-type
-\bar default
-
-\series bold
-\size default
-
-\newline
-
-\series default
-\size scriptsize
-%d
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-decimal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- int
-\newline
-%ld
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-decimal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-long
-\newline
-%hd
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-decimal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-short/char
-\newline
-%x
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-hexadecimal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-int
-\newline
-%lx
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-hexadecimal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-long
-\newline
-%hx
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-hexadecimal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-short/char
-\newline
-%o
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-octal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-int
-\newline
-%lo
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-octal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-long
-\newline
-%ho
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-octal
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-short/char
-\newline
-%c
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-character
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-char/short
-\newline
-%s
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-character
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-_generic pointer
-\layout Standard
-
-The routine is
-\series bold
-very stack intesive
-\series default
-, --stack-after-data parameter should be used when using this routine, the
- routine also takes about 1K of code space .It also expects an external function
- named
-\emph on
-putchar(char )
-\emph default
- to be present (this can be changed).
- When using the %s format the string / pointer should be cast to a generic
- pointer.
- eg.
-\layout Standard
-
-
-\size scriptsize
-printf_small(
-\begin_inset Quotes eld
-\end_inset
-
-my str %s, my int %d
-\backslash
-n
-\begin_inset Quotes erd
-\end_inset
-
-,(char _generic *)mystr,myint);
-\layout Itemize
-
-
-\series bold
-\size large
-stdarg.h
-\series default
-\size default
-- contains definition for the following macros to be used for variable parameter
- list, note that a function can have a variable parameter list if and only
- if it is 'reentrant'
-\begin_deeper
-\layout Standard
-
-
-\size small
-va_list, va_start, va_arg, va_end.
-\end_deeper
-\layout Itemize
-
-
-\series bold
-\size large
-setjmp.h
-\series default
-\size default
-- contains defintion for ANSI
-\series bold
- setjmp
-\series default
-&
-\series bold
-longjmp
-\series default
- routines.
- Note in this case setjmp & longjmp can be used between functions executing
- within the same register bank, if long jmp is executed from a function
- that is using a different register bank from the function issuing the setjmp
- function, the results may be unpredictable.
- The jump buffer requires 3 bytes of data (the stack pointer & a 16 byte
- return address), and can be placed in any address space.
-\layout Itemize
-
-
-\series bold
-\size large
-stdlib.h
-\series default
-\size default
- - contains the following functions.
-\begin_deeper
-\layout Standard
-
-
-\size footnotesize
-atoi, atol.
-\end_deeper
-\layout Itemize
-
-
-\series bold
-\size large
-string.h
-\series default
-\size default
-- contains the following functions.
-\begin_deeper
-\layout Standard
-
-
-\size footnotesize
-strcpy, strncpy, strcat, strncat, strcmp, strncmp, strchr, strrchr, strspn,
- strcspn, strpbrk, strstr, strlen, strtok, memcpy, memcmp, memset.
-\end_deeper
-\layout Itemize
-
-
-\series bold
-\size large
-ctype.h
-\series default
-\size default
- - contains the following routines.
-\begin_deeper
-\layout Standard
-
-
-\size footnotesize
-iscntrl, isdigit, isgraph, islower, isupper, isprint, ispunct, isspace,
- isxdigit, isalnum, isalpha.
-\end_deeper
-\layout Itemize
-
-
-\series bold
-\size large
-malloc.h
-\series default
-\size default
- - The malloc routines are developed by Dmitry S.
- Obukhov (dso@usa.net).
- These routines will allocate memory from the external ram.
- Here is a description on how to use them (as described by the author).
-\begin_deeper
-\layout Standard
-
-
-\size scriptsize
-//Example:
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- #define DYNAMIC_MEMORY_SIZE 0x2000
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .....
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- unsigned char xdata dynamic_memory_pool[DYNAMIC_MEMORY_SIZE];
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- unsigned char xdata * current_buffer;
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .....
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- void main(void)
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- {
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ...
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-//
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- init_dynamic_memory(dynamic_memory_pool,DYNAMIC_MEMORY_SIZE);
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //Now it's possible to use malloc.
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ...
-
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- current_buffer = malloc(0x100);
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- //
-\end_deeper
-\layout Itemize
-
-
-\series bold
-\size large
-serial.h
-\series default
-\size default
- - Serial IO routines are also developed by Dmitry S.
- Obukhov (dso@usa.net).
- These routines are interrupt driven with a 256 byte circular buffer, they
- also expect external ram to be present.
- Please see documentation in file SDCCDIR/sdcc51lib/serial.c .
- Note the header file
-\begin_inset Quotes eld
-\end_inset
-
-serial.h
-\begin_inset Quotes erd
-\end_inset
-
- MUST be included in the file containing the 'main' function.
-\layout Itemize
-
-
-\series bold
-\size large
-ser.h
-\series default
-\size default
-- Alternate serial routine provided by Wolfgang Esslinger <wolfgang@WiredMinds.co
-m> these routines are more compact and faster.
- Please see documentation in file SDCCDIR/sdcc51lib/ser.c
-\layout Itemize
-
-
-\series bold
-\size large
-ser_ir.h
-\series default
-\size default
-- Another alternate set of serial routines provided by Josef Wolf <jw@raven.inka.d
-e> , these routines do not use the external ram.
-\layout Itemize
-
-
-\series bold
-\size large
-reg51.h
-\series default
-\size default
- - contains register definitions for a standard 8051
-\layout Itemize
-
-
-\series bold
-\size large
-reg552.h
-\series default
-\size default
-- contains register definitions for 80C552.
-\layout Itemize
-
-
-\series bold
-\size large
-float.h
-\series default
-\size default
- - contains min, max and other floating point related stuff.
-\layout Standard
-
-All library routines are compiled as --model-small , they are all non-reentrant,
- if you plan to use the large model or want to make these routines reentrant,
- then they will have to be recompiled with the appropriate compiler option.
-\layout Standard
-
-Have not had time to do the more involved routines like printf, will get
- to them shortly.
-\layout Section
-
-Interfacing with assembly routines.
-\begin_inset LatexCommand \label{Interface_asm}
-
-\end_inset
-
-
-\layout Subsection
-
-Global registers used for parameter passing.
-\layout Standard
-
-By default the compiler uses the global registers
-\begin_inset Quotes eld
-\end_inset
-
-DPL,DPH,B,ACC
-\begin_inset Quotes erd
-\end_inset
-
- to pass the first parameter to a routine, the second parameter onwards
- is either allocated on the stack (for reentrant routines or --stack-auto
- is used) or in the internal / external ram (depending on the memory model).
-
-\layout Subsubsection
-
-Assembler routine non-reentrant
-\layout Standard
-
-In the following example the function
-\series bold
- cfunc
-\series default
- calls an assembler routine
-\series bold
-asm_func
-\series default
-, which takes two parameters.
-\layout Standard
-
-
-\size footnotesize
-extern int asm_func( unsigned short, unsigned short);
-\layout Standard
-
-
-\size footnotesize
-
-\protected_separator
-
-\newline
-int c_func (unsigned short i, unsigned short j)
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- return asm_func(i,j);
-\newline
-}
-\size default
-
-\size scriptsize
-
-\newline
-int main()
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-return c_func(10,9);
-\newline
-}
-\layout Standard
-
-The corresponding assembler function is:-
-\layout Standard
-
-
-\size scriptsize
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func_PARM_2
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .area OSEG
-\newline
-_asm_func_PARM_2:
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .ds
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 1
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .area CSEG
-\newline
-_asm_func:
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- a,dpl
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- a,_asm_func_PARM_2
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- dpl,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- dpl,#0x00
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ret
-\layout Standard
-
-Note here that the return values are placed in 'dpl' - One byte return value,
- 'dpl' LSB & 'dph' MSB for two byte values.
- 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph','
-b' & 'acc' for four byte values.
-\layout Standard
-
-The parameter naming convention is
-\series bold
-_<function_name>_PARM_<n>,
-\series default
- where n is the parameter number starting from 1, and counting from the
- left.
- The first parameter is passed in
-\begin_inset Quotes eld
-\end_inset
-
-dpl
-\begin_inset Quotes erd
-\end_inset
-
- for One bye parameter,
-\begin_inset Quotes eld
-\end_inset
-
-dptr
-\begin_inset Quotes erd
-\end_inset
-
- if two bytes,
-\begin_inset Quotes eld
-\end_inset
-
-b,dptr
-\begin_inset Quotes erd
-\end_inset
-
- for three bytes and
-\begin_inset Quotes eld
-\end_inset
-
-acc,b,dptr
-\begin_inset Quotes erd
-\end_inset
-
- for four bytes, the
-\family typewriter
-\series bold
-\size footnotesize
-varaible name for the second parameter will be _<function_name>_PARM_2.
-\layout Standard
-
-Assemble the assembler routine with the following command.
-\layout Standard
-
-asx8051 -losg asmfunc.asm
-\layout Standard
-
-Then compile and link the assembler routine to the C source file with the
- following command,
-\layout Standard
-
-sdcc cfunc.c asmfunc.rel
-\layout Subsubsection
-
-Assembler routine is reentrant
-\layout Standard
-
-In this case the second parameter onwards will be passed on the stack ,
- the parameters are pushed from right to left i.e.
- after the call the left most parameter will be on the top of the stack.
- Here is an example.
-\layout Standard
-
-
-\size footnotesize
-extern int asm_func( unsigned short, unsigned short);
-\layout Standard
-
-
-\size footnotesize
-
-\protected_separator
-
-\layout Standard
-
-
-\size footnotesize
-int c_func (unsigned short i, unsigned short j) reentrant
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- return asm_func(i,j);
-\newline
-}
-\size default
-
-\size scriptsize
-
-\newline
-int main()
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-return c_func(10,9);
-\newline
-}
-\layout Standard
-
-The corresponding assembler routine is.
-\layout Standard
-
-
-\size scriptsize
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func
-\newline
-_asm_func:
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- push
-\protected_separator
- _bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- _bp,sp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-mov
-\protected_separator
- r2,dpl
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- a,_bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- clr
-\protected_separator
- c
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
- a,#0xfd
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- r0,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
- a,#0xfc
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- r1,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- a,@r0
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
- a,r2
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- dpl,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- dph,#0x00
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- sp,_bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- pop
-\protected_separator
- _bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ret
-\layout Standard
-
-The compiling and linking procedure remains the same, however note the extra
- entry & exit linkage required for the assembler code, _bp is the stack
- frame pointer and is used to compute the offset into the stack for parameters
- and local variables.
-\layout Subsection
-
-With --noregparms option.
-\layout Standard
-
-When the source is compiled with --noregparms option , space is allocated
- for each of the parameters passed to a routine.
-\layout Subsubsection
-
-Assembler routine non-reentrant.
-\layout Standard
-
-In the following example the function
-\series bold
- cfunc
-\series default
- calls an assembler routine
-\series bold
-asm_func
-\series default
-, which takes two parameters.
-\layout Standard
-
-
-\size footnotesize
-extern int asm_func( unsigned short, unsigned short);
-\layout Standard
-
-
-\size footnotesize
-
-\protected_separator
-
-\newline
-int c_func (unsigned short i, unsigned short j)
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- return asm_func(i,j);
-\newline
-}
-\size default
-
-\size scriptsize
-
-\newline
-int main()
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-return c_func(10,9);
-\newline
-}
-\layout Standard
-
-The corresponding assembler function is:-
-\layout Standard
-
-
-\size scriptsize
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func_PARM_1
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func_PARM_2
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .area OSEG
-\newline
-_asm_func_PARM_1:
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .ds
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 1
-\newline
-_asm_func_PARM_2:
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .ds
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- 1
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .area CSEG
-\newline
-_asm_func:
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- a,_asm_func_PARM_1
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- a,_asm_func_PARM_2
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- dpl,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- dpl,#0x00
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- ret
-\layout Standard
-
-Note here that the return values are placed in 'dpl' - One byte return value,
- 'dpl' LSB & 'dph' MSB for two byte values.
- 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph','
-b' & 'acc' for four byte values.
-\layout Standard
-
-The parameter naming convention is
-\series bold
-_<function_name>_PARM_<n>,
-\series default
- where n is the parameter number starting from 1, and counting from the
- left.
- i.e.
- the
-\family typewriter
-\series bold
-\size footnotesize
-left-most parameter name will be _<function_name>_PARM_1.
-\layout Standard
-
-Assemble the assembler routine with the following command.
-\layout Standard
-
-asx8051 -losg asmfunc.asm
-\layout Standard
-
-Then compile and link the assembler routine to the C source file with the
- following command,
-\layout Standard
-
-sdcc cfunc.c asmfunc.rel
-\layout Subsubsection
-
-Assembler routine is reentrant.
-\layout Standard
-
-In this case the parameters will be passed on the stack , the parameters
- are pushed from right to left i.e.
- after the call the left most parameter will be on the top of the stack.
- Here is an example.
-\layout Standard
-
-
-\size footnotesize
-extern int asm_func( unsigned short, unsigned short);
-\layout Standard
-
-
-\size footnotesize
-
-\protected_separator
-
-\layout Standard
-
-
-\size footnotesize
-int c_func (unsigned short i, unsigned short j) reentrant
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- return asm_func(i,j);
-\newline
-}
+\series bold
+\size large
+\bar under
+-E
+\series default
\size default
-
-\size scriptsize
-
-\newline
-int main()
-\newline
-{
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-return c_func(10,9);
-\newline
-}
-\layout Standard
-
-The corresponding assembler routine is.
-\layout Standard
-
-
-\size scriptsize
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- .globl _asm_func
-\newline
-_asm_func:
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- push
-\protected_separator
- _bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- _bp,sp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- a,_bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- clr
-\protected_separator
- c
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
- a,#0xfd
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- r0,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- a,_bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- clr
-\protected_separator
- c
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
- a,#0xfc
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- r1,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- a,@r0
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- add
-\protected_separator
- a,@r1
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- dpl,a
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- dph,#0x00
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- mov
-\protected_separator
- sp,_bp
-\newline
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
- pop
-\protected_separator
- _bp
-\newline
-
-\protected_separator
+\bar default
+ Run only the C preprocessor.
+ Preprocess all the C source files specified and output the results to standard
+ output.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
+\series bold
+\size large
+\bar under
+-M
+\series default
+\size default
+\bar default
+ Tell the preprocessor to output a rule suitable for make describing the
+ dependencies of each object file.
+ For each source file, the preprocessor outputs one make-rule whose target
+ is the object file name for that source file and whose dependencies are
+ all the files `#include'd in it.
+ This rule may be a single line or may be continued with `
+\backslash
+'-newline if it is long.
+ The list of rules is printed on standard output instead of the preprocessed
+ C program.
+ `-M' implies `-E'.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
+\series bold
+\size large
+\bar under
+-C
+\series default
+\size default
+\bar default
+ Tell the preprocessor not to discard comments.
+ Used with the `-E' option.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
- ret
-\layout Standard
+\series bold
+\size large
+\bar under
+-MM
+\series default
+\size default
+\bar default
+Like `-M' but the output mentions only the user header files included with
+ `#include file"'.
+ System header files included with `#include <file>' are omitted.
+\layout List
+\labelwidthstring 00.00.0000
-The compiling and linking procedure remains the same, however note the extra
- entry & exit linkage required for the assembler code, _bp is the stack
- frame pointer and is used to compute the offset into the stack for parameters
- and local variables.
-\layout Section
-External Stack.
-\begin_inset LatexCommand \label{xstack}
+\series bold
+\size large
+\bar under
+-Aquestion(answer)
+\series default
+\size default
+\bar default
+ Assert the answer answer for question, in case it is tested with a preprocessor
+ conditional such as `#if #question(answer)'.
+ `-A-' disables the standard assertions that normally describe the target
+ machine.
+\layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+\size large
+\bar under
+-Aquestion
+\series default
+\size default
+\bar default
+ (answer) Assert the answer answer for question, in case it is tested with
+ a preprocessor conditional such as `#if #question(answer)'.
+ `-A-' disables the standard assertions that normally describe the target
+ machine.
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
-The external stack is located at the start of the external ram segment ,
- and is 256 bytes in size.
- When --xstack option is used to compile the program , the parameters and
- local variables of all reentrant functions are allocated in this area.
- This option is provided for programs with large stack space requirements.
- When used with the --stack-auto option, all parameters and local variables
- are allocated on the external stack (note support libraries will need to
- be recompiled with the same options).
-\layout Standard
+\series bold
+\size large
+\bar under
+-Umacro
+\series default
+\size default
+\bar default
+ Undefine macro macro.
+ `-U' options are evaluated after all `-D' options, but before any `-include'
+ and `-imacros' options.
+\layout List
+\labelwidthstring 00.00.0000
-The compiler outputs the higher order address byte of the external ram segment
- into PORT P2, therefore when using the External Stack option, this port
- MAY NOT be used by the application program.
-\layout Section
-ANSI-Compliance.
-\begin_inset LatexCommand \label{ANSI_Compliance}
+\series bold
+\size large
+\bar under
+-dM
+\series default
+\size default
+\bar default
+ Tell the preprocessor to output only a list of the macro definitions that
+ are in effect at the end of preprocessing.
+ Used with the `-E' option.
+\layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+\size large
+\bar under
+-dD
+\series default
+\size default
+\bar default
+ Tell the preprocessor to pass all macro definitions into the output, in
+ their proper sequence in the rest of the output.
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
-Deviations from the compliancy.
-\layout Enumerate
+\series bold
+\size large
+\bar under
+-dN
+\series default
+\size default
+\bar default
+Like `-dD' except that the macro arguments and contents are omitted.
+ Only `#define name' is included in the output.
+\layout List
+\labelwidthstring 00.00.0000
-functions are not always reentrant.
-\layout Enumerate
-structures cannot be assigned values directly, cannot be passed as function
- parameters or assigned to each other and cannot be a return value from
- a function.
-\begin_deeper
-\layout Standard
+\series bold
+\size large
+\bar under
+-S
+\series default
+\size default
+\bar default
+Stop after the stage of compilation proper; do not as- semble.
+ The output is an assembler code file for the input file specified.
+\layout List
+\labelwidthstring 00.00.0000
-\size small
-eg
-\end_deeper
-\layout Standard
+\series bold
+\bar under
+-Wa_asmOption[,asmOption]
+\series default
+\bar default
+...
+ Pass the asmOption to the assembler.
+\layout List
+\labelwidthstring 00.00.0000
-\size small
-struct s { ...
- };
-\newline
-struct s s1, s2;
-\newline
-foo()
-\newline
-{
-\newline
-...
-
-\newline
-s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */
-\newline
-...
-
-\newline
-}
-\layout Standard
+\series bold
+\bar under
+-Wl_linkOption[,linkOption]
+\series default
+\bar default
+ ..
+ Pass the linkOption to the linker.
+\layout List
+\labelwidthstring 00.00.0000
-\size small
-struct s foo1 (struct s parms) /* is invalid in SDCC although allowed in
- ANSI */
-\newline
-{
-\newline
-struct s rets;
-\newline
-...
+\series bold
+\size large
+\bar under
+--int-long-reent
+\series default
+\bar default
-\newline
-return rets;/* is invalid in SDCC although allowed in ANSI */
-\newline
-}
-\layout Enumerate
-
-'long long' (64 bit integers) not supported.
-\layout Enumerate
+\size default
+ Integer (16 bit) and long (32 bit) libraries have been compiled as reentrant.
+ Note by default these libraries are compiled as non-reentrant.
+ See section Installation for more details.
+\layout List
+\labelwidthstring 00.00.0000
-'double' precision floating point not supported.
-\layout Enumerate
-integral promotions are suppressed.
- What does this mean ? The compiler will not implicitly promote an integer
- expression to a higher order integer, exception is an assignment or parameter
- passing.
+\series bold
+\size large
+\bar under
+--cyclomatic
+\size default
-\layout Enumerate
-
-No support for
+\series default
+\bar default
+This option will cause the compiler to generate an information message for
+ each function in the source file.
+ The message contains some
\emph on
-setjmp
+important
\emph default
- and
+ information about the function.
+ The number of edges and nodes the compiler detected in the control flow
+ graph of the function, and most importantly the
\emph on
-longjmp
+cyclomatic complexity
\emph default
- (for now).
-\layout Enumerate
-
-Old K&R style function declarations are NOT allowed.
-\layout Standard
+ see section on Cyclomatic Complexity for more details.
+\layout List
+\labelwidthstring 00.00.0000
-\size footnotesize
-foo( i,j) /* this old style of function declarations */
-\newline
-int i,j; /* are valid in ANSI ..
- not valid in SDCC */
-\newline
-{
-\newline
-...
+\series bold
+\size large
+\bar under
+--float-reent
+\size default
-\newline
-}
-\layout Enumerate
-
-functions declared as pointers must be dereferenced during the call.
-\begin_deeper
-\layout Standard
-
-
-\size small
-int (*foo)();
-\end_deeper
-\layout Standard
-
+\series default
+\bar default
+ Floating point library is compiled as reentrant.See section Installation
+ for more details.
+\layout List
+\labelwidthstring 00.00.0000
-\size small
-\protected_separator
-
-\protected_separator
-...
+\series bold
+\size large
+\bar under
+--out-fmt-ihx
+\size default
-\newline
+\series default
+\bar default
+The linker output (final object code) is in Intel Hex format.
+ (This is the default option).
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-
-\protected_separator
-/* has to be called like this */
-\newline
-\protected_separator
+\series bold
+\size large
+\bar under
+--out-fmt-s19
+\size default
-\protected_separator
-(*foo)();/* ansi standard allows calls to be made like 'foo()' */
-\layout Section
-
-Cyclomatic Complexity
-\begin_inset LatexCommand \label{Cyclomatic}
-
-\end_inset
-
-
-\layout Standard
-
-Cyclomatic complexity of a function is defined as the number of independent
- paths the program can take during execution of the function.
- This is an important number since it defines the number test cases you
- have to generate to validate the function .
- The accepted industry standard for complexity number is 10, if the cyclomatic
- complexity reported by SDCC exceeds 10 you should think about simplification
- of the function logic.
-\layout Standard
+\series default
+\bar default
+The linker output (final object code) is in Motorola S19 format.
+\layout List
+\labelwidthstring 00.00.0000
-Note that the complexity level is not related to the number of lines of
- code in a function.
- Large functions can have low complexity, and small functions can have large
- complexity levels.
- SDCC uses the following formula to compute the complexity.
-\layout Standard
+\series bold
+\size large
+\bar under
+--nooverlay
+\series default
+\size default
+\bar default
+ The compiler will not overlay parameters and local variables of any function,
+ see section Parameters and local variables for more details.
+\layout List
+\labelwidthstring 00.00.0000
-\size small
-complexity = (number of edges in control flow graph) -
-\newline
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-(number of nodes in control flow graph) + 2;
-\layout Standard
+\series bold
+\size large
+\bar under
+--main-return
+\series default
+\size default
+\bar default
+ This option can be used when the code generated is called by a monitor
+ program.
+ The compiler will generate a 'ret' upon return from the 'main' function.
+ The default option is to lock up i.e.
+ generate a 'ljmp .' .
+\layout List
+\labelwidthstring 00.00.0000
-Having said that the industry standard is 10, you should be aware that in
- some cases it may unavoidable to have a complexity level of less than 10.
- For example if you have switch statement with more than 10 case labels,
- each case label adds one to the complexity level.
- The complexity level is by no means an absolute measure of the algorithmic
- complexity of the function, it does however provide a good starting point
- for which functions you might look at for further optimization.
-\layout Section
-TIPS
-\begin_inset LatexCommand \label{Tips}
+\series bold
+\size large
+\bar under
+--no-peep
+\series default
+\size default
+\bar default
+ Disable peep-hole optimization.
+\layout List
+\labelwidthstring 00.00.0000
-\end_inset
+\series bold
+\size large
+\bar under
+--peep-asm
+\series default
+\size default
+\bar default
+ Pass the inline assembler code through the peep hole optimizer.
+ Can cause unexpected changes to inline assembler code , please go through
+ the peephole optimizer rules defnied in file 'SDCCpeeph.def' before using
+ this option.
+\layout List
+\labelwidthstring 00.00.0000
-\layout Standard
-Here are a few guide-lines that will help the compiler generate more efficient
- code, some of the tips are specific to this compiler others are generally
- good programming practice.
-\layout Itemize
+\series bold
+\size large
+\bar under
+--iram-size
+\series default
+\size default
+\bar default
+<Value> Causes the linker to check if the interal ram usage is within limits
+ of the given value.
+\layout Subsubsection
-Use the smallest data type to represent your data-value.
- If it is known in advance that the value is going to be less than 256 then
- use a 'short' or 'char' instead of an 'int'.
-\layout Itemize
+Intermediate Dump Options
+\layout Standard
-Use unsigned when it is known in advance that the value is not going to
- be negative.
- This helps especially if you are doing division or multiplication.
-\layout Itemize
+The following options are provided for the purpose of retargetting and debugging
+ the compiler .
+ These provided a means to dump the intermediate code (iCode) generated
+ by the compiler in human readable form at various stages of the compilation
+ process.
+
+\layout List
+\labelwidthstring 00.00.0000
-NEVER jump into a LOOP.
-\layout Itemize
-Declare the variables to be local whenever possible, especially loop control
- variables (induction).
-\layout Itemize
+\series bold
+\size large
+\bar under
+--dumpraw
+\series default
+\size default
+\bar default
+.
+ This option will cause the compiler to dump the intermediate code into
+ a file of named
+\emph on
+<source filename>.dumpraw
+\emph default
+ just after the intermediate code has been generated for a function , i.e.
+ before any optimizations are done.
+ The basic blocks at this stage ordered in the depth first number, so they
+ may not be in sequence of execution.
+\layout List
+\labelwidthstring 00.00.0000
-Since the compiler does not do implicit integral promotion, the programmer
- should do an explicit cast when integral promotion is required.
-\layout Itemize
-Reducing the size of division , multiplication & modulus operations can
- reduce code size substantially.
- Take the following code for example.
-\begin_deeper
-\layout Standard
+\series bold
+\size large
+\bar under
+--dumpgcse
+\series default
+\bar default
+.
+\size default
+ Will create a dump if iCode, after global subexpression elimination, into
+ a file named
+\emph on
+<source filename>.dumpgcse.
+\layout List
+\labelwidthstring 00.00.0000
-\size footnotesize
-foobar( unsigned int p1, unsigned char ch)
-\newline
-{
-\newline
-\protected_separator
+\series bold
+\size large
+\bar under
+--dumpdeadcode
+\series default
+\size default
+\bar default
+.Will create a dump if iCode, after deadcode elimination, into a file named
+
+\emph on
+<source filename>.dumpdeadcode.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
+\series bold
+\size large
+\bar under
+--dumploop.
-\protected_separator
-unsigned char ch1 = p1 % ch ;
-\newline
+\series default
+\bar default
+
+\size default
+Will create a dump if iCode, after loop optimizations, into a file named
+
+\emph on
+<source filename>.dumploop.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\protected_separator
+\series bold
+\size large
+\bar under
+--dumprange.
-\protected_separator
+\series default
+\bar default
+
+\size default
+Will create a dump if iCode, after live range analysis, into a file named
+
+\emph on
+<source filename>.dumprange.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-....
-\protected_separator
-\protected_separator
+\series bold
+\size large
+\bar under
+--dumpregassign.
-\protected_separator
+\size default
+
+\series default
+\bar default
+Will create a dump if iCode, after register assignment , into a file named
+
+\emph on
+<source filename>.dumprassgn.
+\layout List
+\labelwidthstring 00.00.0000
-\protected_separator
-\newline
-}
+\series bold
+\size large
+\bar under
+--dumpall.
+
+\series default
+\size default
+\bar default
+Will cause all the above mentioned dumps to be created.
\layout Standard
-For the modulus operation the variable ch will be promoted to unsigned int
- first then the modulus operation will be performed (this will lead to a
- call to a support routine).
- If the code is changed to
+Note that the files created for the dump are appended to each time.
+ So the files should be deleted manually , before each dump is created.
+
\layout Standard
+When reporting bugs, it can be helpful to include these dumps along with
+ the portion of the code that is causing the problem.
+\layout Subsection
-\size footnotesize
-foobar( unsigned int p1, unsigned char ch)
-\newline
-{
-\newline
-
-\protected_separator
+MCS51 Storage Class Language Extensions
+\layout Standard
-\protected_separator
+In addition to the ANSI storage classes SDCC allows the following MCS51
+ specific storage classes.
+\layout Subsubsection
-\protected_separator
+xdata
+\layout Standard
-\protected_separator
-unsigned char ch1 = (unsigned char)p1 % ch ;
-\newline
+Variables declared with this storage class will be placed in the extern
+ RAM.
+ This is the
+\series bold
+default
+\series default
+ storage class for Large Memory model .
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+eg.
+
+\emph on
+xdata unsigned char xduc;
+\layout Subsubsection
-\protected_separator
+data
+\layout Standard
-\protected_separator
-....
-\protected_separator
+This is the
+\series bold
+default
+\series default
+ storage class for Small Memory model.
+ Variables declared with this storage class will be allocated in the internal
+ RAM.
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+eg.
-\protected_separator
+\emph on
+ data int iramdata;
+\layout Subsubsection
-\newline
-}
+idata
\layout Standard
-It would substantially reduce the code generated (future versions of the
- compiler will be smart enough to detect such optimization oppurtunities).
-\end_deeper
+Variables declared with this storage class will be allocated into the indirectly
+ addressable portion of the internal ram of a 8051 .
\layout Standard
-\series bold
-Notes from an USER ( Trefor@magera.freeserve.co.uk )
+\size footnotesize
+eg.
+\emph on
+idata int idi;
+\layout Subsubsection
+
+bit
\layout Standard
-The 8051 family of micro controller have a minimum of 128 bytes of internal
- memory which is structured as follows
+This is a data-type and a storage class specifier.
+ When a variable is declared as a bit , it is allocated into the bit addressable
+ memory of 8051.
\layout Standard
-- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers R7 to R7
-
-\layout Standard
+eg.
+\emph on
+bit iFlag;
+\layout Subsubsection
-- Bytes 20-2F - 16 bytes to hold 128 bit variables and
+sfr / sbit
\layout Standard
-- Bytes 30-7F - 60 bytes for general purpose use.
+Like the bit keyword,
+\emph on
+sfr / sbit
+\emph default
+signifies both a data-type and storage class, they are used to describe
+ the special function registers and special bit variables of a 8051.
+
\layout Standard
-Normally the SDCC compiler will only utilise the first bank of registers,
- but it is possible to specify that other banks of registers should be used
- in interrupt routines.
- By default, the compiler will place the stack after the last bank of used
- registers, i.e.
- if the first 2 banks of registers are used, it will position the base of
- the internal stack at address 16 (0X10).
- This implies that as the stack grows, it will use up the remaining register
- banks, and the 16 bytes used by the 128 bit variables, and 60 bytes for
- general purpose use.
-\layout Standard
+eg.
-By default, the compiler uses the 60 general purpose bytes to hold "near
- data".
- The compiler/optimiser may also declare some Local Variables in this area
- to hold local data.
+\emph on
\layout Standard
-If any of the 128 bit variables are used, or near data is being used then
- care needs to be taken to ensure that the stack does not grow so much that
- it starts to over write either your bit variables or "near data".
- There is no runtime checking to prevent this from happening.
-\layout Standard
-
-The amount of stack being used is affected by the use of the "internal stack"
- to save registers before a subroutine call is made, - --stack-auto will
- declare parameters and local variables on the stack - the number of nested
- subroutines.
-\layout Standard
-If you detect that the stack is over writing you data, then the following
- can be done.
- --xstack will cause an external stack to be used for saving registers and
- (if --stack-auto is being used) storing parameters and local variables.
- However this will produce more and code which will be slower to execute.
-
+\emph on
+sfr at 0x80 P0;
+\emph default
+\noun on
+/* special function register P0 at location 0x80 */
\layout Standard
---stack-loc will allow you specify the start of the stack, i.e.
- you could start it after any data in the general purpose area.
- However this may waste the memory not used by the register banks and if
- the size of the "near data" increases, it may creep into the bottom of
- the stack.
-\layout Standard
---stack-after-data, similar to the --stack-loc, but it automatically places
- the stack after the end of the "near data".
- Again this could waste any spare register space.
-\layout Standard
+\emph on
+sbit at 0xd7 CY; /*
+\noun on
+CY (Carry Flag) */
+\layout Subsection
---data-loc allows you to specify the start address of the near data.
- This could be used to move the "near data" further away from the stack
- giving it more room to grow.
- This will only work if no bit variables are being used and the stack can
- grow to use the bit variable space.
+Pointers
\layout Standard
-Conclusion.
+SDCC allows (via language extensions) pointers to explicitly point to any
+ of the memory spaces of the 8051.
+ In addition to the explicit pointers, the compiler also allows a
+\emph on
+_generic
+\emph default
+ class of pointers which can be used to point to any of the memory spaces.
+
\layout Standard
-If you find that the stack is over writing your bit variables or "near data"
- then the approach which best utilised the internal memory is to position
- the "near data" after the last bank of used registers or, if you use bit
- variables, after the last bit variable by using the --data-loc, e.g.
- if two register banks are being used and no data variables, --data-loc
- 16, and - use the --stack-after-data option.
+Pointer declaration examples.
\layout Standard
-If bit variables are being used, another method would be to try and squeeze
- the data area in the unused register banks if it will fit, and start the
- stack after the last bit variable.
-\layout Section
-
-Retargetting for other MCUs.
-\begin_inset LatexCommand \label{Retargetting}
-
-\end_inset
+\size small
+/* pointer physically in xternal ram pointing to object in internal ram
+ */
+\newline
+data unsigned char * xdata p;
+\newline
\layout Standard
-The issues for retargetting the compiler are far too numerous to be covered
- by this document.
- What follows is a brief description of each of the seven phases of the
- compiler and its MCU dependency.
-\layout Enumerate
-Parsing the source and building the annotated parse tree.
- This phase is largely MCU independent (except for the language extensions).
- Syntax & semantic checks are also done in this phase , along with some
- initial optimizations like back patching labels and the pattern matching
- optimizations like bit-rotation etc.
-\layout Enumerate
+\size small
+/* pointer physically in code rom pointing to data in xdata space */
+\newline
+xdata unsigned char * code p;
+\newline
-The second phase involves generating an intermediate code which can be easy
- manipulated during the later phases.
- This phase is entirely MCU independent.
- The intermediate code generation assumes the target machine has unlimited
- number of registers, and designates them with the name iTemp.
- The compiler can be made to dump a human readable form of the code generated
- by using the --dumpraw option.
-\layout Enumerate
+\layout Standard
-This phase does the bulk of the standard optimizations and is also MCU independe
-nt.
- This phase can be broken down into several sub-phases.
-\begin_deeper
-\layout Itemize
-Break down intermediate code (iCode) into basic blocks.
-\layout Itemize
+\size small
+/* pointer physically in code space pointing to data in code space */
+\newline
+code unsigned char * code p;
+\newline
-Do control flow & data flow analysis on the basic blocks.
-\layout Itemize
+\newline
+/* the folowing is a generic pointer physically located in xdata space */
+\newline
+char * xdata p;
+\layout Standard
-Do local common subexpression elimination, then global subexpression elimination
-\layout Itemize
+Well you get the idea.
+ For compatibility with the previous version of the compiler, the following
+ syntax for pointer declaration is also supported.
+ Note the above examples will be portable to other commercially available
+ compilers.
+\layout Standard
-dead code elimination
-\layout Itemize
-loop optimizations
-\layout Itemize
+\size small
+unsigned char _xdata *ucxdp; /* pointer to data in external ram */
+\newline
+unsigned char _data \SpecialChar ~
+*ucdp ; /* pointer to data in internal ram */
+\newline
+unsigned char _code \SpecialChar ~
+*uccp ; /* pointer to data in R/O code space */
+\newline
+unsigned char _idata *uccp; \SpecialChar ~
+/* pointer to upper 128 bytes of ram */
+\layout Standard
-if loop optimizations caused any changes then do 'global subexpression eliminati
-on' and 'dead code elimination' again.
-\end_deeper
-\layout Enumerate
+All unqualified pointers are treated as 3 - byte '_generic' pointers.
+ These type of pointers can also to be explicitly declared.
+\layout Standard
-This phase determines the live-ranges; by live range I mean those iTemp
- variables defined by the compiler that still survive after all the optimization
-s.
- Live range analysis is essential for register allocation, since these computati
-on determines which of these iTemps will be assigned to registers, and for
- how long.
-\layout Enumerate
-Phase five is register allocation.
- There are two parts to this process .
-\begin_deeper
-\layout Enumerate
+\size small
+unsigned char _generic *ucgp;
+\layout Standard
-The first part I call 'register packing' (for lack of a better term) .
- In this case several MCU specific expression folding is done to reduce
- register pressure.
-\layout Enumerate
+The highest order byte of the generic pointers contains the data space informati
+on.
+ Assembler support routines are called whenever data is stored or retrieved
+ using _generic pointers.
+ These are useful for developing reusable library routines.
+ Explicitly specifying the pointer type will generate the most efficient
+ code.
+ Pointers declared using a mixture of OLD/NEW style could have unpredictable
+ results.
+\layout Subsection
-The second part is more MCU independent and deals with allocating registers
- to the remaining live ranges.
- A lot of MCU specific code does creep into this phase because of the limited
- number of index registers available in the 8051.
-\end_deeper
-\layout Enumerate
+Parameters & Local Variables
+\layout Standard
-The Code generation phase is (unhappily), entirely MCU dependent and very
- little (if any at all) of this code can be reused for other MCU.
- However the scheme for allocating a homogenized assembler operand for each
- iCode operand may be reused.
-\layout Enumerate
+Automatic (local) variables and parameters to functions can either be placed
+ on the stack or in data-space.
+ The default action of the compiler is to place these variables in the internal
+ RAM ( for small model) or external RAM (for Large model).
+ They can be placed on the stack either by using the
+\emph on
+ --stack-auto
+\emph default
+ compiler option or by using the 'reentrant' keyword in the function declaration.
+\layout Standard
-As mentioned in the optimization section the peep-hole optimizer is rule
- based system, which can reprogrammed for other MCUs.
-\layout Section
-Reporting Bugs
-\begin_inset LatexCommand \label{Bugs}
+\family typewriter
+\size scriptsize
+eg
+\layout Standard
-\end_inset
+\size small
+unsigned short foo( short i) reentrant {
+\newline
+...
+
+\newline
+}
+\layout Standard
+Note that when the parameters & local variables are declared in the internal/ext
+ernal ram the functions are non-reentrant.
+ Since stack space on 8051 is limited the
+\emph on
+'reentrant'
+\emph default
+keyword or the
+\emph on
+ --stack-auto
+\emph default
+ option should be used sparingly.
+ Note the reentrant keyword just means that the parameters & local variables
+ will be allocated to the stack, it DOES NOT mean that the function is register
+ bank independent.
\layout Standard
-Shoot of an email to 'sandeep.dutta@usa.net', as a matter of principle I always
- reply to all email's sent to me.
- Bugs will be fixed ASAP.
- When reporting a bug , it is useful to include a small snippet of code
- that is causing the problem, if possible compile your program with the
- --dumpall option and send the dump files along with the bug report.
-\layout Section
-
-SDCDB - Source level debugger.
+When compiled with the default option (i.e.
+ non-reentrant ), local variables can be assigned storage classes and absolute
+ addresses.
+
\layout Standard
-SDCC is distributed with a source level debugger.
- The debugger uses a command line interface, the command repertoire of the
- debugger has been kept as close to gdb ( the GNU debugger) as possible.
- The configuration and build process of the compiler see Installation
-\begin_inset LatexCommand \ref{Installation}
-\end_inset
+\family typewriter
+\size scriptsize
+eg
+\layout Standard
- also builds and installs the debugger in the target directory specified
- during configuration.
- The debugger allows you debug BOTH at the C source and at the ASM source
- level.
-\layout Subsection
-Compiling for debugging.
+\size small
+unsigned short foo() {
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+xdata unsigned short i;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+bit bvar;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+data at 0x31 unsiged short j;
+\newline
+...
+
+\newline
+}
\layout Standard
-The
+In the above example the variable
\emph on
---debug
+i
\emph default
- option must be specified for all files for which debug information is to
- be generated.
- The complier generates a
+ will be allocated in the external ram,
\emph on
-.cdb
+bvar
\emph default
- file for each of these files.
- The linker updates the
+ in bit addressable space and
\emph on
-.cdb
+ j
\emph default
- file with the address information.
- This .cdb is used by the debugger .
+ in internal ram.
+ When compiled with the
+\emph on
+--stack-auto
+\emph default
+ or when a function is declared as
+\emph on
+'reentrant'
+\emph default
+ local variables cannot be assigned storage classes or absolute addresses.
+\layout Standard
+
+Parameters however are not allowed any storage class, (storage classes for
+ parameters will be ignored), their allocation is governed by the memory
+ model in use , and the reentrancy options.
\layout Subsection
-How the debugger works.
+Overlaying
\layout Standard
-When the
+For non-reentrant functions SDCC will try to reduce internal ram space usage
+ by overlaying parameters and local variables of a function (if possible).
+ Parameters and local variables of a function will be allocated to an overlayabl
+e segment if the function has
\emph on
---debug
+no other function calls and the function is non-reentrant and the memory
+ model is small.
+
\emph default
- option is specified the compiler generates extra symbol information some
- of which are put into the the assembler source and some are put into the
- .cdb file, the linker updates the .cdb file with the address information
- for the symbols.
- The debugger reads the symbolic information generated by the compiler &
- the address information generated by the linker.
- It uses the SIMULATOR (Daniel's S51) to execute the program, the program
- execution is controlled by the debugger.
- When a command is issued for the debugger, it translates it into appropriate
- commands for the simulator .
-\layout Subsection
+ If an explicit storage class is specified for a local variable , it will
+ NOT be overplayed.
+\layout Standard
-Starting the debugger.
+Note that the compiler (not the linkage editor) makes the decision for overlayin
+g the data items.
+ Functions that are called from an interrupt service routine should be preceded
+ by a #pragma NOOVERLAY if they are not reentrant Along the same lines the
+ compiler does not do any processing with the inline assembler code so the
+ compiler might incorrectly assign local variables and parameters of a function
+ into the overlay segment if the only function call from a function is from
+ inline assembler code, it is safe to use the #pragma NOOVERLAY for functions
+ which call other functions using inline assembler code.
\layout Standard
-The debugger can be started using the following command line.
- (Assume the file you are debugging has
+Parameters and Local variables of functions that contain 16 or 32 bit multiplica
+tion or division will NOT be overlayed since these are implemented using
+ external functions.
\layout Standard
-the file name foo).
+eg.
\layout Standard
->sdcdb foo
+
+\size small
+#pragma SAVE
+\newline
+#pragma NOOVERLAY
+\newline
+void set_error( unsigned short errcd)
+\newline
+{
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ P3 = errcd;
+\newline
+}
+\newline
+#pragma RESTORE
+\newline
+void some_isr () interrupt 2 using 1
+\newline
+{
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ set_error(10);
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+
+\newline
+}
\layout Standard
-The debugger will look for the following files.
-\layout Enumerate
+In the above example the parameter
+\emph on
+errcd
+\emph default
+ for the function
+\emph on
+set_error
+\emph default
+ would be assigned to the overlayable segment (if the #pragma NOOVERLAY
+ was not present) , this could cause unpredictable runtime behavior.
+ The pragma NOOVERLAY ensures that the parameters and local variables for
+ the function are NOT overlayed.
+\layout Subsection
-foo.c - the source file.
-\layout Enumerate
+Critical Functions
+\layout Standard
-foo.cdb - the debugger symbol information file.
-\layout Enumerate
+A special keyword may be associated with a function declaring it as '
+\emph on
+critical
+\emph default
+'.
+ SDCC will generate code to disable all interrupts upon entry to a critical
+ function and enable them back before returning .
+ Note that nesting critical functions may cause unpredictable results.
+\layout Standard
-foo.ihx - the intel hex format object file.
-\layout Subsection
+eg
+\layout Standard
-Command line options.
-\layout Itemize
---directory=<source file directory> this option can used to specify the
- directory search list.
- The debugger will look into the directory list specified for source , cdb
- & ihx files.
- The items in the directory list must be separated by ':' , e.g.
- if the source files can be in the directories /home/src1 and /home/src2,
- the --directory option should be --directory=/home/src1:/home/src2 .
- Note there can be no spaces in the option.
+\size small
+int foo () critical
+\newline
+{
+\newline
+...
-\layout Itemize
-
--cd <directory> - change to the <directory>.
-\layout Itemize
+\newline
+...
+
+\newline
+}
+\layout Standard
--fullname - used by GUI front ends.
-\layout Itemize
+The critical attribute maybe used with other attributes like
+\emph on
+reentrant.
+\layout Subsection
--cpu <cpu-type> - this argument is passed to the simulator please see the
- simulator docs for details.
-\layout Itemize
+Absolute Addressing
+\layout Standard
--X <Clock frequency > this options is passed to the simulator please see
- simulator docs for details.
-\layout Itemize
+Data items can be assigned an absolute address with the
+\emph on
+at <address>
+\emph default
+ keyword, in addition to a storage class.
+\layout Standard
--s <serial port file> passed to simulator see simulator docs for details.
-\layout Itemize
+eg.
+
+\layout Standard
--S <serial in,out> passed to simulator see simulator docs for details.
-\layout Subsection
-Debugger Commands.
+\size small
+xdata at 0x8000 unsigned char PORTA_8255 ;
\layout Standard
-As mention earlier the command interface for the debugger has been deliberately
- kept as close the GNU debugger gdb , as possible, this will help int integratio
-n with existing graphical user interfaces (like ddd, xxgdb or xemacs) existing
- for the GNU debugger.
-\layout Subsubsection
+In the above example the
+\emph on
+PORTA_8255
+\emph default
+ will be allocated to the location 0x8000 of the external ram.
+
+\layout Standard
-break [line | file:line | function | file:function]
+Note that is this feature is provided to give the programmer access to
+\emph on
+memory mapped
+\emph default
+ devices attached to the controller.
+ The compiler does not actually reserve any space for variables declared
+ in this way (they are implemented with an equate in the assembler), thus
+ it is left to the programmer to make sure there are no overlaps with other
+ variables that are declared without the absolute address, the assembler
+ listing file (.lst) and the linker output files (<filename>.rst) and (<filename>.m
+ap) are a good places to look for such overlaps.
\layout Standard
-Set breakpoint at specified line or function.
+Absolute address can be specified for variables in all storage classes.
\layout Standard
-sdcdb>break 100
-\newline
-sdcdb>break foo.c:100
-\newline
-sdcdb>break funcfoo
-\newline
-sdcdb>break foo.c:funcfoo
-\layout Subsubsection
-clear [line | file:line | function | file:function ]
+\size small
+eg.
\layout Standard
-Clear breakpoint at specified line or function.
+
+\size small
+bit at 0x02 bvar;
\layout Standard
-sdcdb>clear 100
-\newline
-sdcdb>clear foo.c:100
-\newline
-sdcdb>clear funcfoo
-\newline
-sdcdb>clear foo.c:funcfoo
-\layout Subsubsection
+The above example will allocate the variable at offset 0x02 in the bit-addressab
+le space.
+ There is no real advantage to assigning absolute addresses to variables
+ in this manner , unless you want strict control over all the variables
+ allocated.
+\layout Subsection
-continue
+Interrupt Service Routines
\layout Standard
-Continue program being debugged, after breakpoint.
-\layout Subsubsection
-
-finish
+SDCC allows interrupt service routines to be coded in C, with some extended
+ keywords.
\layout Standard
-Execute till the end of the current function.
-\layout Subsubsection
-delete [n]
+\size small
+void timer_isr (void) interrupt 2 using 1
+\newline
+{
+\newline
+..
+
+\newline
+}
\layout Standard
-Delete breakpoint number 'n'.
- If used without any option clear ALL user defined break points.
-\layout Subsubsection
-
-info [break | stack | frame | registers ]
-\layout Itemize
+The number following the 'interrupt' keyword is the interrupt number this
+ routine will service.
+ The compiler will insert a call to this routine in the interrupt vector
+ table for the interrupt number specified.
+ The 'using' keyword is used to tell the compiler to use the specified register
+ bank (8051 specific) when generating code for this function.
+ Note that when some function is called from an interrupt service routine
+ it should be preceded by a #pragma NOOVERLAY (if it is not reentrant) .
+ A special note here, int (16 bit) and long (32 bit) integer division, multiplic
+ation & modulus operations are implemented using external support routines
+ developed in ANSI-C, if an interrupt service routine needs to do any of
+ these operations then the support routines (as mentioned in a following
+ section) will have to recompiled using the --stack-auto option and the
+ source file will need to be compiled using the --int-long-rent compiler
+ option.
+\layout Standard
-info break - list all breakpoints
-\layout Itemize
+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
+ in the file that contains the function
+\emph on
+'main'
+\emph default
+.
+\layout Standard
-info stack - show the function call stack.
-\layout Itemize
+Interrupt Numbers and the corresponding address & descriptions for the Standard
+ 8051 are listed below.
+ SDCC will automatically adjust the interrupt vector table to the maximum
+ interrupt number specified.
+\layout Standard
-info frame - show information about the current execution frame.
-\layout Itemize
-info registers - show content of all registers.
-\layout Subsubsection
+\begin_inset Tabular
+<lyxtabular version="2" rows="6" columns="3">
+<features rotate="false" islongtable="false" endhead="0" endfirsthead="0" endfoot="0" endlastfoot="0">
+<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special="">
+<column alignment="center" valignment="top" leftline="true" rightline="false" width="" special="">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="" special="">
+<row topline="true" bottomline="true" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-step
\layout Standard
-Step program until it reaches a different source line.
-\layout Subsubsection
+Interrupt #
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-next
\layout Standard
-Step program, proceeding through subroutine calls.
-\layout Subsubsection
+Description
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-run
\layout Standard
-Start debugged program.
-\layout Subsubsection
+Vector Address
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="false" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-ptype variable
\layout Standard
-Print type information of the variable.
-\layout Subsubsection
+0
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-print variable
\layout Standard
-print value of variable.
-\layout Subsubsection
+External 0
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-file filename
\layout Standard
-load the given file name.
- Note this is an alternate method of loading file for debugging.
-\layout Subsubsection
+0x0003
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="false" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-frame
\layout Standard
-print information about current frame.
-\layout Subsubsection
+1
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-set srcmode
\layout Standard
-Toggle between C source & assembly source.
-\layout Subsubsection
+Timer 0
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-! simulator command
\layout Standard
-Send the string following '!' to the simulator, the simulator response is
- displayed.
- Note the debugger does not interpret the command being sent to the simulator,
- so if a command like 'go' is sent the debugger can loose its execution
- context and may display incorrect values.
-\layout Subsubsection
+0x000B
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="false" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-quit.
\layout Standard
-"Watch me now.
- Iam going Down.
- My name is Bobby Brown"
-\layout Subsection
-
-Interfacing with XEmacs.
-\layout Standard
+2
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-Two files are (in emacs lisp) are provided for the interfacing with XEmacs,
-\emph on
- sdcdb.el
-\emph default
- and
-\emph on
-sdcdbsrc.el
-\emph default
-.
- These two files can be found in the $(prefix)/bin directory after the installat
-ion is complete.
- These files need to be loaded into XEmacs for the interface to work, this
- can be done at XEmacs startup time by inserting the following into your
-
-\emph on
-'.xemacs'
-\emph default
- file (which can be found in your HOME directory)
-\emph on
-(load-file sdcdbsrc.el)
-\emph default
-[ .xemacs is a lisp file so the () around the command is REQUIRED), the files
- can also be loaded dynamically while XEmacs is running, set the environment
- variable
-\emph on
-'EMACSLOADPATH'
-\emph default
-to the installation bin directory [$(prefix)/bin], then enter the following
- command
-\emph on
-ESC-x load-file sdcdbsrc .
-
-\emph default
-To start the interface enter the following command
-\emph on
-ESC-x sdcdbsrc
-\emph default
- , you will prompted to enter the file name to be debugged.
-
\layout Standard
-The command line options that are passed to the simulator directly are bound
- to default values in the file
-\emph on
-sdcdbsrc.el
-\emph default
-the variables are listed below these values maybe changed as required.
-\layout Itemize
+External 1
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-sdcdbsrc-cpu-type '51
-\layout Itemize
+\layout Standard
-sdcdbsrc-frequency '11059200
-\layout Itemize
+0x0013
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="false" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-sdcdbsrc-serial nil
\layout Standard
-The following is a list of key mapping for the debugger interface.
+3
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
+
\layout Standard
+Timer 1
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\size scriptsize
+0x001B
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true" newpage="false">
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\newline
-;; Current Listing ::
-\newline
-;;key
-\protected_separator
+\layout Standard
-\protected_separator
+4
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="false" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
+Serial
+\end_inset
+</cell>
+<cell multicolumn="0" alignment="center" valignment="top" topline="true" bottomline="false" leftline="true" rightline="true" rotate="false" usebox="none" width="" special="">
+\begin_inset Text
-\protected_separator
+\layout Standard
-\protected_separator
+0x0023
+\end_inset
+</cell>
+</row>
+</lyxtabular>
-\protected_separator
+\end_inset
-\protected_separator
-\protected_separator
+\layout Standard
-\protected_separator
+If the interrupt service routine is defined without a register bank or with
+ register bank 0 (using 0), the compiler will save the registers used by
+ itself on the stack (upon entry and restore them at exit), however if such
+ an interrupt service routine calls another function then the entire register
+ bank will be saved on the stack.
+ This scheme may be advantageous for small interrupt service routines which
+ have low register usage.
+\layout Standard
-\protected_separator
+If the interrupt service routine is defined to be using a specific register
+ bank then only
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+a
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+,
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+b
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
-binding
-\protected_separator
+ &
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+dptr
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ are save and restored, if such an interrupt service routine calls another
+ function (using another register bank) then the entire register bank of
+ the called function will be saved on the stack.
+ This scheme is recommended for larger interrupt service routines.
+\layout Standard
-\protected_separator
+Calling other functions from an interrupt service routine is not recommended
+ avoid it if possible.
+\layout Subsection
-\protected_separator
+Startup Code
+\layout Standard
-\protected_separator
+The compiler inserts a jump to the C routine
+\series bold
+_sdcc__external__startup()
+\series default
+at the start of the CODE area.
+ This routine can be found in the file
+\series bold
+SDCCDIR/sdcc51lib/_startup.c
+\series default
+, by default this routine returns 0, if this routine returns a non-zero
+ value , the static & global variable initialization will be skipped and
+ the function main will be invoked, other wise static & global variables
+ will be initialized before the function main is invoked.
+ You could add a
+\series bold
+_sdcc__external__startup()
+\series default
+ routine to your program to override the default if you needed to setup
+ hardware or perform some other critical operation prior to static & global
+ variable initialization.
+\layout Subsection
-\protected_separator
+Inline Assembler Code
+\layout Standard
-\protected_separator
+SDCC allows the use of in-line assembler with a few restriction as regards
+ labels.
+ All labels defined within inline assembler code HAS TO BE of the
+\emph on
+form nnnnn$
+\emph default
+ where nnnn is a number less than 100 (which implies a limit of utmost 100
+ inline assembler labels
+\noun on
+per function)
+\noun default
+.
+ It is strongly recommended that each assembly instruction (including labels)
+ be placed in a separate line ( as the example shows).
+ When the
+\series bold
+\bar under
+--peep-asm
+\series default
+\bar default
+ command line option is used, the inline assembler code will be passed through
+ the peephole optimizer, this might cause some unexpected changes in the
+ inline assembler code, please go throught the peephole optimizer rules
+ defined in file 'SDCCpeeph.def' carefully before using this option.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+eg
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+_asm
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+mov b,#10
+\newline
+00001$:
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+djnz b,00001$
+\newline
+_endasm ;
+\layout Standard
-\protected_separator
+The inline assembler code can contain any valid code understood by the assembler
+ (this includes any assembler directives and comment lines ) .
+ The compiler does not do any validation of the code within the
+\emph on
+_asm ...
+ _endasm;
+\emph default
+ keyword pair.
+
+\layout Standard
-\protected_separator
+Inline assembler code cannot reference any C-Labels however it can reference
+ labels defined by the inline assembler.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+eg
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+foo() {
+\newline
+...
+ /* some c code */
+\newline
+_asm
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+; some assembler code
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ ljmp $0003
+\newline
+_endasm ;
+\newline
+...
+ /* some more c code */
+\newline
+clabel: \SpecialChar ~
+ /* inline assembler cannot reference this label */
+\newline
+_asm
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+$0003: ;label (can be reference by inline assembler only)
+\newline
+_endasm ;
+\newline
+...
+
+\newline
+}
+\layout Standard
-\protected_separator
+In other words inline assembly code can access labels defined in inline
+ assembly.
+ The same goes the other way, ie.
+ labels defines in inline assembly CANNOT be accessed by C statements.
+\layout Subsection
-\protected_separator
+int(16 bit) and long (32 bit ) Support
+\layout Standard
-\protected_separator
+For signed & unsigned int (16 bit) and long (32 bit) variables, division,
+ multiplication and modulus operations are implemented by support routines.
+ These support routines are all developed in ANSI-C to facilitate porting
+ to other MCUs.
+ The following files contain the described routine, all of them can be found
+ in the directory SDCCDIR/sdcc51lib
+\layout Itemize
-\protected_separator
-Comment
-\newline
-;;---
-\protected_separator
-\protected_separator
+\size footnotesize
+_mulsint.c - signed 16 bit multiplication (calls _muluint)
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_muluint.c - unsigned 16 bit multiplication
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_divsint.c - signed 16 bit division (calls _divuint)
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_divuint.c - unsigned 16 bit division.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_modsint.c - signed 16 bit modulus (call _moduint)
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_moduint.c - unsigned 16 bit modulus.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_mulslong.c - signed 32 bit multiplication (calls _mululong)
+\layout Itemize
-\protected_separator
--------
-\protected_separator
-\protected_separator
+\size footnotesize
+_mululong.c - unsigned32 bit multiplication.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_divslong.c - signed 32 division (calls _divulong)
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_divulong.c - unsigned 32 division.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_modslong.c - signed 32 bit modulus (calls _modulong).
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_modulong.c - unsigned 32 bit modulus.
+\layout Standard
-\protected_separator
+All these routines are compiled as non-reentrant and small model.
+ Since they are compiled as non-reentrant, interrupt service routines should
+ not do any of the above operations, if this unavoidable then the above
+ routines will need to ne compiled with the --stack-auto option, after which
+ the source program will have to be compiled with --int-long-rent option.
+\layout Subsection
-\protected_separator
+Floating Point Support
+\layout Standard
-\protected_separator
+SDCC supports IEEE (single precision 4bytes) floating point numbers.The floating
+ point support routines are derived from gcc's floatlib.c and consists of
+ the following routines.
+
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fsadd.c - add floating point numbers.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fssub.c - subtract floating point numbers
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fsdiv.c - divide floating point numbers
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fsmul.c - multiply floating point numbers
+\layout Itemize
-\protected_separator
--------
-\newline
-;;
-\newline
-;; n
-\protected_separator
-\protected_separator
+\size footnotesize
+_fs2uchar.c - convert floating point to unsigned char
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fs2char.c - convert floating point to signed char.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fs2uint.c - convert floating point to unsigned int.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fs2int.c - convert floating point to signed int.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fs2ulong.c - convert floating point to unsigned long.
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_fs2long.c - convert floating point to signed long.
+\layout Itemize
-\protected_separator
-\protected_separator
- sdcdb-next-from-src
-\protected_separator
+\size footnotesize
+_uchar2fs.c - convert unsigned char to floating point
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_char2fs.c - convert char to floating point number
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_uint2fs.c - convert unsigned int to floating point
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_int2fs.c - convert int to floating point numbers
+\layout Itemize
-\protected_separator
-\protected_separator
+\size footnotesize
+_ulong2fs.c - convert unsigned long to floating point number
+\layout Itemize
-\protected_separator
-SDCDB next command
-\newline
-;; b
-\protected_separator
-\protected_separator
+\size footnotesize
+_long2fs.c - convert long to floating point number.
+\layout Standard
-\protected_separator
+Note if all these routines are used simultaneously the data space might
+ overflow.
+ For serious floating point usage it is strongly recommended that the Large
+ model be used (in which case the floating point routines mentioned above
+ will need to recompiled with the --model-Large option)
+\layout Subsection
-\protected_separator
+MCS51 Memory Models
+\layout Standard
-\protected_separator
+SDCC allows two memory models for MCS51 code, small and large.
+ Modules compiled with different memory models should never be combined
+ together or the results would be unpredictable.
+ The library routines supplied with the compiler are compiled as both small
+ and large.
+ The compiled library modules are contained in seperate directories as small
+ and large so that you can link to either set.
+ In general the use of the large model is discouraged.
+\layout Standard
-\protected_separator
+When the large model is used all variables declared without a storage class
+ will be allocated into the external ram, this includes all parameters and
+ local variables (for non-reentrant functions).
+ When the small model is used variables without storage class are allocated
+ in the internal ram.
+\layout Standard
-\protected_separator
+Judicious usage of the processor specific storage classes and the 'reentrant'
+ function type will yield much more efficient code, than using the large-model.
+ Several optimizations are disabled when the program is compiled using the
+ large model, it is therefore strongly recommdended that the small model
+ be used unless absolutely required.
+\layout Subsection
-\protected_separator
+Flat 24 bit Addressing Model
+\layout Standard
-\protected_separator
+This option generates code for the 24 bit contiguous addressing mode of
+ the Dallas DS80C390 part.
+ In this mode, up to four meg of external RAM or code space can be directly
+ addressed.
+ See the data sheets at www.dalsemi.com for further information on this part.
+\layout Standard
-\protected_separator
+In older versions of the compiler, this option was used with the MCS51 code
+ generator (-mmcs51).
+ Now, however, the '390 has it's own code generator, selected by the -mds390
+ switch.
+ This code generator currently supports only the flat24 model, but the --model-f
+lat24 switch is still required, in case later versions of the code generator
+ support other models (such as the paged mode of the '390).
+ The combination of -mmcs51 and --model-flat24 is now depracated.
+\layout Standard
-\protected_separator
+Note that the compiler does not generate any code to place the processor
+ into24 bitmode (it defaults to 8051 compatible mode).
+ Boot loader or similar code must ensure that the processor is in 24 bit
+ contiguous addressing mode before calling the SDCC startup code.
+\layout Standard
-\protected_separator
+Like the --model-large option, variables will by default be placed into
+ the XDATA segment.
+
+\layout Standard
-\protected_separator
+Segments may be placed anywhere in the 4 meg address space using the usual
+ --*-loc options.
+ Note that if any segments are located above 64K, the -r flag must be passed
+ to the linker to generate the proper segment relocations, and the Intel
+ HEX output format must be used.
+ The -r flag can be passed to the linker by using the option -Wl-r on the
+ sdcc command line.
+\layout Subsection
-\protected_separator
- sdcdb-back-from-src
-\protected_separator
+Defines Created by the Compiler
+\layout Standard
-\protected_separator
+The compiler creates the following #defines .
+\layout Itemize
-\protected_separator
+SDCC - this Symbol is always defined.
+\layout Itemize
-\protected_separator
+SDCC_STACK_AUTO - this symbol is defined when --stack-auto option is used.
+\layout Itemize
-\protected_separator
+SDCC_MODEL_SMALL - when small model is used.
+\layout Itemize
-\protected_separator
+SDCC_MODEL_LARGE - when --model-large is used.
+\layout Itemize
-\protected_separator
+SDCC_USE_XSTACK - when --xstack option is used.
+\layout Section
-\protected_separator
+SDCC Technical Data
+\layout Subsection
-\protected_separator
+Optimizations
+\layout Standard
-\protected_separator
-SDCDB back command
-\newline
-;; c
-\protected_separator
+SDCC performs a a host of standard optimizations in addition to some MCU
+ specific optimizations.
+
+\layout Subsubsection
-\protected_separator
+Sub-expression Elimination
+\layout Standard
-\protected_separator
+The compiler does
+\emph on
+local and global
+\emph default
+common subexpression elimination.
+\layout Standard
-\protected_separator
-\protected_separator
+\family typewriter
+\size scriptsize
+eg.
+
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+i = x + y + 1;
+\size default
-\protected_separator
+\newline
+j
+\size small
+= x + y;
+\layout Standard
-\protected_separator
+will be translated to
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+iTemp = x + y
+\newline
+i = iTemp + 1
+\newline
+j = iTemp
+\layout Standard
-\protected_separator
+Some subexpressions are not as obvious as the above example.
+\layout Standard
-\protected_separator
+eg.
+\layout Standard
-\protected_separator
- sdcdb-cont-from-src
-\protected_separator
-\protected_separator
+\size small
+a->b[i].c = 10;
+\newline
+a->b[i].d = 11;
+\layout Standard
-\protected_separator
+In this case the address arithmetic
+\emph on
+a->b[i]
+\emph default
+will be computed only once; the equivalent code in C would be.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+iTemp = a->b[i];
+\newline
+iTemp.c = 10;
+\newline
+iTemp.d = 11;
+\layout Standard
-\protected_separator
+The compiler will try to keep these temporary variables in registers.
+\layout Subsubsection
-\protected_separator
+Dead-Code Elimination
+\layout Standard
-\protected_separator
+eg.
+\layout Standard
-\protected_separator
-\protected_separator
-SDCDB continue command
+\size small
+int global;
\newline
-;; s
-\protected_separator
-
-\protected_separator
+void f () {
+\newline
+\SpecialChar ~
+\SpecialChar ~
+int i;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+i = 1; \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* dead store */
+\newline
+\SpecialChar ~
+\SpecialChar ~
+global = 1; /* dead store */
+\newline
+\SpecialChar ~
+\SpecialChar ~
+global = 2;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+return;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+global = 3; /* unreachable */
+\newline
+}
+\layout Standard
-\protected_separator
+will be changed to
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+int global; void f ()
+\newline
+{ \SpecialChar ~
+ \SpecialChar ~
+
+\newline
+\SpecialChar ~
+global = 2; \SpecialChar ~
+ \SpecialChar ~
+
+\newline
+\SpecialChar ~
+return;
+\newline
+}
+\layout Subsubsection
-\protected_separator
+Copy-Propagation
+\layout Standard
-\protected_separator
+eg.
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+int f() {
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+int i, j;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+i = 10;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+j = i;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return j;
+\newline
+}
+\layout Standard
-\protected_separator
+will be changed to
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+int f() {
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ int i,j;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ i = 10;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ j = 10;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ return 10;
+\newline
+}
+\layout Standard
-\protected_separator
+Note: the dead stores created by this copy propagation will be eliminated
+ by dead-code elimination .
+\layout Subsubsection
-\protected_separator
- sdcdb-step-from-src
-\protected_separator
+Loop Optimizations
+\layout Standard
-\protected_separator
+Two types of loop optimizations are done by SDCC loop invariant lifting
+ and strength reduction of loop induction variables.In addition to the strength
+ reduction the optimizer marks the induction variables and the register
+ allocator tries to keep the induction variables in registers for the duration
+ of the loop.
+ Because of this preference of the register allocator , loop induction optimizat
+ion causes an increase in register pressure, which may cause unwanted spilling
+ of other temporary variables into the stack / data space .
+ The compiler will generate a warning message when it is forced to allocate
+ extra space either on the stack or data space.
+ If this extra space allocation is undesirable then induction optimization
+ can be eliminated either for the entire source file ( with --noinduction
+ option) or for a given function only (#pragma NOINDUCTION).
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+Loop Invariant:
+\layout Standard
-\protected_separator
+eg
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+for (i = 0 ; i < 100 ; i ++)
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+f += k + l;
+\layout Standard
-\protected_separator
+changed to
+\layout Standard
-\protected_separator
-\protected_separator
-SDCDB step command
+\size small
+itemp = k + l;
\newline
-;; ?
-\protected_separator
-
-\protected_separator
+for ( i = 0; i < 100; i++ ) f += itemp;
+\layout Standard
-\protected_separator
+As mentioned previously some loop invariants are not as apparent, all static
+ address computations are also moved out of the loop.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+Strength Reduction :
+\layout Standard
-\protected_separator
+This optimization substitutes an expression by a cheaper expression.
+\layout Standard
-\protected_separator
+eg.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+for (i=0;i < 100; i++) ar[i*5] = i*3;
+\layout Standard
-\protected_separator
+changed to
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+itemp1 = 0;
+\newline
+itemp2 = 0;
+\newline
+for (i=0;i< 100;i++) {
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ar[itemp1] = itemp2;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+itemp1 += 5;
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+itemp2 += 3;
+\newline
+}
+\layout Standard
-\protected_separator
+The more expensive multiplication is changed to a less expensive addition.
+\layout Subsubsection
-\protected_separator
- sdcdb-whatis-c-sexp
-\protected_separator
+Loop Reversing:
+\layout Standard
-\protected_separator
+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
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+decrement and jump if not zero
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ instruction.
+ SDCC checks for the following criterion to determine if a loop is reversible
+ (note: more sophisticated compiers use data-dependency analysis to make
+ this determination, SDCC uses a more simple minded analysis).
+\layout Itemize
-\protected_separator
+The 'for' loop is of the form
+\newline
-\protected_separator
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+for ( <symbol> = <expression> ; <sym> [< | <=] <expression> ; [<sym>++ |
+ <sym> += 1])
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+<for body>
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
-\protected_separator
+\layout Itemize
-\protected_separator
-SDCDB ptypecommand for data at
-\newline
-;;
-\protected_separator
+The <for body> does not contain
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+continue
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ or 'break
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+.
+\layout Itemize
-\protected_separator
+All goto's are contained within the loop.
+\layout Itemize
-\protected_separator
+No function calls within the loop.
+\layout Itemize
-\protected_separator
+The loop control variable <sym> is not assigned any value within the loop
+\layout Itemize
-\protected_separator
+The loop control variable does NOT participate in any arithmetic operation
+ within the loop.
+\layout Itemize
-\protected_separator
+There are NO switch statements in the loop.
+\layout Standard
-\protected_separator
+Note djnz instruction can be used for 8-bit values ONLY, therefore it is
+ advantageous to declare loop control symbols as either 'char' or 'short',
+ ofcourse this may not be possible on all situations.
+\layout Subsubsection
-\protected_separator
+Algebraic Simplifications
+\layout Standard
-\protected_separator
+SDCC does numerous algebraic simplifications, the following is a small sub-set
+ of these optimizations.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+eg
+\emph on
+
+\emph default
-\protected_separator
+\newline
+i = j + 0 ; /* changed to */ i = j;
+\newline
+i /= 2; /* changed to */ i >>= 1;
+\newline
+i = j - j ; /* changed to */ i = 0;
+\newline
+i = j / 1 ; /* changed to */ i = j;
+\layout Standard
-\protected_separator
+Note the subexpressions given above are generally introduced by macro expansions
+ or as a result of copy/constant propagation.
+\layout Subsubsection
-\protected_separator
+'switch' Statements
+\layout Standard
-\protected_separator
+SDCC changes switch statements to jump tables when the following conditions
+ are true.
+
+\layout Itemize
-\protected_separator
+The case labels are in numerical sequence , the labels need not be in order,
+ and the starting number need not be one or zero.
+\layout Standard
-\protected_separator
+eg
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+switch(i) {\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+switch (i) {
+\newline
+case 4:...
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+case 1: ...
+
+\newline
+case 5:...
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+case 2: ...
+
+\newline
+case 3:...
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+case 3: ...
+
+\newline
+case 6:...
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+case 4: ...
+
+\newline
+}\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+}
+\layout Standard
-\protected_separator
+Both the above switch statements will be implemented using a jump-table.
+\layout Itemize
-\protected_separator
+The number of case labels is at least three, since it takes two conditional
+ statements to handle the boundary conditions.
+\layout Itemize
-\protected_separator
+The number of case labels is less than 84, since each label takes 3 bytes
+ and a jump-table can be utmost 256 bytes long.
+
+\layout Standard
-\protected_separator
+Switch statements which have gaps in the numeric sequence or those that
+ have more that 84 case labels can be split into more than one switch statement
+ for efficient code generation.
+\layout Standard
-\protected_separator
+eg
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+switch (i) {
+\newline
+case 1: ...
+
+\newline
+case 2: ...
+
+\newline
+case 3: ...
+
+\newline
+case 4: ...
+
+\newline
+case 9: ...
+
+\newline
+case 10: ...
+
+\newline
+case 11: ...
+
+\newline
+case 12: ...
+
+\newline
+}
+\layout Standard
-\protected_separator
+If the above switch statement is broken down into two switch statements
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+switch (i) {
+\newline
+case 1: ...
+
+\newline
+case 2: ...
+
+\newline
+case 3: ...
+
+\newline
+case 4: ...
+
+\newline
+}
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+switch (i) {
+\newline
+case 9: ...
+
+\newline
+case 10: ...
+
+\newline
+case 11: ...
+
+\newline
+case 12:...
+
+\newline
+}
+\layout Standard
-\protected_separator
+then both the switch statements will be implemented using jump-tables whereas
+ the unmodified switch statement will not be .
+\layout Subsubsection
-\protected_separator
+Bit-shifting Operations.
+\layout Standard
-\protected_separator
+Bit shifting is one of the most frequently used operation in embedded programmin
+g .
+ SDCC tries to implement bit-shift operations in the most efficient way
+ possible.
+\layout Standard
-\protected_separator
+eg.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+unsigned short i;
+\layout Standard
-\protected_separator
-\protected_separator
- buffer point
+\size small
+...
+
\newline
-;; x
-\protected_separator
-
-\protected_separator
+i>>= 4;
+\newline
+..
+\layout Standard
-\protected_separator
+generates the following code.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+mov a,_i
+\newline
+swap a
+\newline
+anl a,#0x0f
+\newline
+mov _i,a
+\layout Standard
-\protected_separator
+In general SDCC will never setup a loop if the shift count is known.
+ Another example
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+unsigned int i;
+\newline
+...
+
+\newline
+i >>= 9;
+\newline
+...
+\layout Standard
-\protected_separator
+will generate
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+mov a,(_i + 1)
+\newline
+mov (_i + 1),#0x00
+\newline
+clr c
+\newline
+rrc a
+\newline
+mov _i,a
+\layout Standard
-\protected_separator
+Note that SDCC stores numbers in
+\noun on
+little-endian
+\noun default
+format (i.e.
+ lowest order first)
+\layout Subsubsection
-\protected_separator
+Bit-rotation
+\layout Standard
-\protected_separator
- sdcdbsrc-delete
-\protected_separator
+A special case of the bit-shift operation is bit rotation, SDCC recognizes
+ the following expression to be a left bit-rotation.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+unsigned char i;
+\newline
+...
+
+\newline
+i = ( ( i << 1) | ( i >> 7));
+\newline
+...
+\layout Standard
-\protected_separator
+will generate the following code.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+mov a,_i
+\newline
+rl a
+\newline
+mov _i,a
+\layout Standard
-\protected_separator
+SDCC uses pattern matching on the parse tree to determine this operation
+ .Variations of this case will also be recognized as bit-rotation i.e
+\emph on
+ i = ((i >> 7) | (i << 1));
+\emph default
+/* left-bit rotation */
+\layout Subsubsection
-\protected_separator
+Highest Order Bit
+\layout Standard
-\protected_separator
+It is frequently required to obtain the highest order bit of an integral
+ type (int,long,short or char types).
+ SDCC recognizes the following expression to yield the highest order bit
+ and generates optimized code for it.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+eg
+\newline
+unsigned int gint;
+\newline
+foo () {
+\newline
+unsigned char hob;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+hob = (gint >> 15) & 1;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+..
+
+\newline
+}
+\layout Standard
-\protected_separator
+Will generate the following code.
+\layout Standard
-\protected_separator
-\protected_separator
-SDCDB Delete all breakpoints if no arg
+\size small
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 61 ;\SpecialChar ~
+ hob.c 7
\newline
-;;
-\protected_separator
-
-\protected_separator
+\SpecialChar ~
+\SpecialChar ~
+ 000A E5*01\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 62\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ a,(_gint + 1)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+ 000C 33\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 63\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ rlc\SpecialChar ~
+ a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+ 000D E4\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 64\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ clr\SpecialChar ~
+ a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+ 000E 13\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 65\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ rrc\SpecialChar ~
+ a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+ 000F F5*02\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 66\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ _foo_hob_1_1,a
+\layout Standard
-\protected_separator
+Variations of this case however will NOT be recognized .
+ It is a standard C expression , so I heartily recommend this be the only
+ way to get the highest order bit, (it is portable).
+ Of course it will be recognized even if it is embedded in other expressions.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+eg.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+xyz = gint + ((gint >> 15) & 1);
+\layout Standard
-\protected_separator
+will still be recognized.
+\layout Subsubsection
-\protected_separator
+Peep-hole Optimizer
+\layout Standard
-\protected_separator
+The compiler uses a rule based , pattern matching and re-writing mechanism
+ for peep-hole optimization .
+ It is inspired by '
+\emph on
+copt'
+\emph default
+ a peep-hole optimizer by Christopher W.
+ Fraser (cwfraser@microsoft.com).
+ A default set of rules are compiled into the compiler, additional rules
+ may be added with the --peep-file <filename> option.
+ The rule language is best illustrated with examples.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+replace {
+\newline
+mov %1,a
+\newline
+mov a,%1 } by { mov %1,a }
+\layout Standard
-\protected_separator
+The above rule will the following assembly sequence
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+mov r1,a
+\newline
+mov a,r1
+\layout Standard
-\protected_separator
+to
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+mov r1,a
+\layout Standard
-\protected_separator
+Note: All occurrences of a '%n' ( pattern variable ) must denote the same
+ string.
+ With the above rule, the assembly sequence
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+mov r1,a
+\newline
+mov a,r2
+\layout Standard
-\protected_separator
+will remain unmodified.
+ Other special case optimizations may be added by the user (via --peep-file
+ option), eg.
+ some variants of the 8051 MCU allow only 'AJMP' and 'ACALL' , the following
+ two rules will change all 'LJMP' & 'LCALL' to 'AJMP' & 'ACALL'.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+replace { lcall %1 } by { acall %1 }
+\newline
+replace { ljmp %1 } by { ajmp %1 }
+\layout Standard
-\protected_separator
+The inline-assembler' code is also passed through the peep hole optimizer,
+ thus the peephole optimizer can also be used as an assembly level macro
+ expander.
+ The rules themselves are MCU dependent whereas the rule language infra-structur
+e is MCU independent.
+ Peephole optimization rules for other MCU can be easily programmed using
+ the rule language.
+\layout Standard
-\protected_separator
+The syntax for a rule is as follows ,
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+rule := replace [ restart ] '{' <assembly sequence> '
+\backslash
+n'
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ '}' by '{' '
+\backslash
+n'
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ <assembly sequence> '
+\backslash
+n'
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ '}' [if <functionName> ] '
+\backslash
+n'
+\newline
+<assembly sequence> := assembly instruction (each instruction including
+ labels must be on a separate line).\SpecialChar ~
+ \SpecialChar ~
-\protected_separator
+\layout Standard
-\protected_separator
+The optimizer will apply to the rules one by one from the top in the sequence
+ of their appearance, it will terminate when all rules are exhausted.
+ If the '
+\emph on
+restart
+\emph default
+' option is specified, then the optimizer will start matching the rules
+ again from the top, this option for a rule is expensive (performance),
+ it is intended to be used in situations where a transformation will trigger
+ the same rule again.
+ A good example of this the following rule.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+replace restart {
+\newline
+pop %1
+\newline
+push %1 } by {
+\newline
+; nop
+\newline
+}
+\layout Standard
-\protected_separator
+Note that the replace pattern cannot be a blank, but can be a comment line.
+ Without the '
+\emph on
+restart
+\emph default
+' option only the inner most 'pop' 'push' pair would be eliminated.
+ i.e.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+pop ar1
+\newline
+pop ar2
+\newline
+push ar2
+\newline
+push ar1
+\layout Standard
-\protected_separator
+would result in
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+pop ar1
+\newline
+; nop
+\newline
+push ar1
+\layout Standard
-\protected_separator
+with the '
+\emph on
+restart
+\emph default
+' option the rule will be applied again to the resulting code and the all
+ the '
+\emph on
+pop' 'push'
+\emph default
+ pairs will be eliminated to yield
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+; nop
+\newline
+; nop
+\layout Standard
-\protected_separator
+A conditional function can be attached to a rule.
+ Attaching rules are somewhat more involved, let me illustrate this with
+ an example.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+replace {
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ljmp %5
+\newline
+%2:} by {
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+sjmp %5
+\newline
+%2:} if labelInRange
+\layout Standard
-\protected_separator
+The optimizer does a look-up of a function name table defined in function
+ '
+\emph on
+callFuncByName'
+\emph default
+ in the source file
+\emph on
+SDCCpeeph.c
+\emph default
+ , 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
+ case the use of
+\emph on
+'%5
+\emph default
+' is crucial, since the function
+\emph on
+labelInRange
+\emph default
+ expects to find the label in that particular variable (the hash table containin
+g the variable bindings is passed as a parameter).
+ If you want to code more such functions , take a close look at the function
+
+\emph on
+labelInRange
+\emph default
+ and the calling mechanism in source file
+\emph on
+SDCCpeeph.c
+\emph default
+.
+ I know this whole thing is a little kludgey , may be some day we will have
+ some better means.
+ If you are looking at this file, you will also see the default rules that
+ are compiled into the compiler, you can your own rules in the default set
+ there if you get tired of specifying the
+\emph on
+--peep-file
+\emph default
+ option.
+\layout Subsection
-\protected_separator
-given or delete arg (C-u arg x)
-\newline
-;; m
-\protected_separator
+Pragmas
+\layout Standard
-\protected_separator
+SDCC supports the following
+\emph on
+#pragma
+\emph default
+directives.
+ This directives are applicable only at a function level.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+SAVE
+\series default
+ - this will save all the current options .
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+RESTORE
+\series default
+- will restore the saved options from the last save.
+ Note that SAVES & RESTOREs cannot be nested.
+ SDCC uses the same buffer to save the options each time a SAVE is called.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+NOGCSE
+\series default
+ - will stop global subexpression elimination.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+NOINDUCTION
+\series default
+ - will stop loop induction optimizations .
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+NOJTBOUND
+\series default
+ - will not generate code for boundary value checking , when switch statements
+ are turned into jump-tables.
+\layout Itemize
-\protected_separator
-\protected_separator
- sdcdbsrc-frame
-\protected_separator
+\series bold
+NOOVERLAY
+\series default
+- the compiler will not overlay the parameters and local variables of a
+ function.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+NOLOOPREVERSE
+\series default
+ - Will not do loop reversal optimization
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+EXCLUDE NONE | {acc[,b[,dpl[,dph]]]
+\series default
+ - The exclude pragma disables generation of pair of push/pop instruction
+ in ISR function (using interrupt keyword).
+ The directive should be placed immediately before the ISR function definition
+ and it affects ALL ISR functions following it.
+ To enable the normal register saving for ISR functions use
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+#pragma EXCLUDE none
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
-\protected_separator
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+CALLEE-SAVES function1[,function2[,function3...]]
+\series default
+ - The compiler by default uses a caller saves convention for register saving
+ across function calls, however this can cause unneccessary register pushing
+ & popping when calling small functions from larger functions.
+ This option can be used to switch the register saving convention for the
+ function names specified.
+ The compiler will not save registers when calling these functions, extra
+ code will be generated at the entry & exit for these functions to save
+ & restore the registers used by these functions, this can SUBSTANTIALLY
+ reduce code & improve run time performance of the generated code.
+ In future the compiler (with interprocedural analysis) will be able to
+ determine the appropriate scheme to use for each function call.
+ If --callee-saves command line option is used, the function names specified
+ in #pragma CALLEE-SAVES is appended to the list of functions specified
+ inthe command line.
+\layout Standard
-\protected_separator
+The pragma's are intended to be used to turn-off certain optimizations which
+ might cause the compiler to generate extra stack / data space to store
+ compiler generated temporary variables.
+ This usually happens in large functions.
+ Pragma directives should be used as shown in the following example, they
+ are used to control options & optimizations for a given function; pragmas
+ should be placed
+\noun on
+before
+\noun default
+ and/or
+\noun on
+after
+\noun default
+ a function, placing pragma's inside a function body could have unpredictable
+ results.
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+eg
+\layout Standard
-\protected_separator
-\protected_separator
-SDCDB Display current frame if no arg,
+\size scriptsize
+#pragma SAVE \SpecialChar ~
+ /* save the current settings */
\newline
-;;
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
+#pragma NOGCSE /* turnoff global subexpression elimination */
+\newline
+#pragma NOINDUCTION /* turn off induction optimizations */
+\newline
+int foo ()
+\newline
+{
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ /* large code */
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+
+\newline
+}
+\newline
+#pragma RESTORE /* turn the optimizations back on */
+\layout Standard
-\protected_separator
+The compiler will generate a warning message when extra space is allocated.
+ It is strongly recommended that the SAVE and RESTORE pragma's be used when
+ changing options for a function.
+\layout Subsection
-\protected_separator
+Library Routines
+\layout Standard
-\protected_separator
+The following library routines are provided for your convenience.
+\layout Standard
-\protected_separator
-\protected_separator
+\series bold
+\size large
+stdio.h
+\series default
+\size default
+- Contains the following functions printf & sprintf these routines are developed
+ by
+\emph on
+Martijn van Balen <balen@natlab.research.philips.com>.
+
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+%[flags][width][b|B|l|L]type
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ flags: -\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ left justify output in specified field width
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ +\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ prefix output with +/- sign if output is signed type
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ space\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ prefix output with a blank if it's a signed positive value
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ width:\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ specifies minimum number of characters outputted for numbers
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ or strings.
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ - For numbers, spaces are added on the left when needed.
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ If width starts with a zero character, zeroes and used
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ instead of spaces.
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ - For strings, spaces are are added on the left or right (when
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ flag '-' is used) when needed.
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ b/B:\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ byte argument (used by d, u, o, x, X)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ l/L:\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ long argument (used by d, u, o, x, X)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ type:\SpecialChar ~
+ d\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ decimal number
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ u\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ unsigned decimal number
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ o\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ unsigned octal number
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ x\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ unsigned hexadecimal number (0-9, a-f)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ X\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ unsigned hexadecimal number (0-9, A-F)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ c\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ character
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ s\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ string (generic pointer)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ p\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ generic pointer (I:data/idata, C:code, X:xdata, P:paged)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ f\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ float (still to be implemented)
+\layout Standard
-\protected_separator
+Also contains a very simple version of printf (
+\series bold
+printf_small
+\series default
+).
+ This simplified version of printf supports only the following formats.
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+\bar under
+format\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+output\SpecialChar ~
+type\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+argument-type
+\bar default
+
+\series bold
+\size default
-\protected_separator
+\newline
-\protected_separator
+\series default
+\size scriptsize
+%d \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+decimal \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ int
+\newline
+%ld\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+decimal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+long
+\newline
+%hd\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+decimal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+short/char
+\newline
+%x\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+hexadecimal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+int
+\newline
+%lx\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+hexadecimal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+long
+\newline
+%hx\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+hexadecimal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+short/char
+\newline
+%o\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+octal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+int
+\newline
+%lo\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+octal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+long
+\newline
+%ho\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+octal\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+short/char
+\newline
+%c\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+character\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+char/short
+\newline
+%s\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+character\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_generic pointer
+\layout Standard
-\protected_separator
+The routine is
+\series bold
+very stack intesive
+\series default
+, --stack-after-data parameter should be used when using this routine, the
+ routine also takes about 1K of code space .It also expects an external function
+ named
+\emph on
+putchar(char )
+\emph default
+ to be present (this can be changed).
+ When using the %s format the string / pointer should be cast to a generic
+ pointer.
+ eg.
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+printf_small(
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+my str %s, my int %d
+\backslash
+n
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+,(char _generic *)mystr,myint);
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+stdarg.h
+\series default
+\size default
+- contains definition for the following macros to be used for variable parameter
+ list, note that a function can have a variable parameter list if and only
+ if it is 'reentrant'
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+va_list, va_start, va_arg, va_end.
+\end_deeper
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+setjmp.h
+\series default
+\size default
+- contains defintion for ANSI
+\series bold
+ setjmp
+\series default
+&
+\series bold
+longjmp
+\series default
+ routines.
+ Note in this case setjmp & longjmp can be used between functions executing
+ within the same register bank, if long jmp is executed from a function
+ that is using a different register bank from the function issuing the setjmp
+ function, the results may be unpredictable.
+ The jump buffer requires 3 bytes of data (the stack pointer & a 16 byte
+ return address), and can be placed in any address space.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+stdlib.h
+\series default
+\size default
+ - contains the following functions.
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
-given or display frame arg
-\newline
-;;
-\protected_separator
+\size footnotesize
+atoi, atol.
+\end_deeper
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+string.h
+\series default
+\size default
+- contains the following functions.
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+strcpy, strncpy, strcat, strncat, strcmp, strncmp, strchr, strrchr, strspn,
+ strcspn, strpbrk, strstr, strlen, strtok, memcpy, memcmp, memset.
+\end_deeper
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+ctype.h
+\series default
+\size default
+ - contains the following routines.
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+iscntrl, isdigit, isgraph, islower, isupper, isprint, ispunct, isspace,
+ isxdigit, isalnum, isalpha.
+\end_deeper
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+malloc.h
+\series default
+\size default
+ - The malloc routines are developed by Dmitry S.
+ Obukhov (dso@usa.net).
+ These routines will allocate memory from the external ram.
+ Here is a description on how to use them (as described by the author).
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+//Example:
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ #define DYNAMIC_MEMORY_SIZE 0x2000
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .....
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ unsigned char xdata dynamic_memory_pool[DYNAMIC_MEMORY_SIZE];
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ unsigned char xdata * current_buffer;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .....
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ void main(void)
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ {
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ...
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+//\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ init_dynamic_memory(dynamic_memory_pool,DYNAMIC_MEMORY_SIZE);
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //Now it's possible to use malloc.
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ...
+
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ current_buffer = malloc(0x100);
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ //
+\end_deeper
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+serial.h
+\series default
+\size default
+ - Serial IO routines are also developed by Dmitry S.
+ Obukhov (dso@usa.net).
+ These routines are interrupt driven with a 256 byte circular buffer, they
+ also expect external ram to be present.
+ Please see documentation in file SDCCDIR/sdcc51lib/serial.c .
+ Note the header file
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+serial.h
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ MUST be included in the file containing the 'main' function.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+ser.h
+\series default
+\size default
+- Alternate serial routine provided by Wolfgang Esslinger <wolfgang@WiredMinds.co
+m> these routines are more compact and faster.
+ Please see documentation in file SDCCDIR/sdcc51lib/ser.c
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+ser_ir.h
+\series default
+\size default
+- Another alternate set of serial routines provided by Josef Wolf <jw@raven.inka.d
+e> , these routines do not use the external ram.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+reg51.h
+\series default
+\size default
+ - contains register definitions for a standard 8051
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+reg552.h
+\series default
+\size default
+- contains register definitions for 80C552.
+\layout Itemize
-\protected_separator
-\protected_separator
+\series bold
+\size large
+float.h
+\series default
+\size default
+ - contains min, max and other floating point related stuff.
+\layout Standard
-\protected_separator
+All library routines are compiled as --model-small , they are all non-reentrant,
+ if you plan to use the large model or want to make these routines reentrant,
+ then they will have to be recompiled with the appropriate compiler option.
+\layout Standard
-\protected_separator
+Have not had time to do the more involved routines like printf, will get
+ to them shortly.
+\layout Subsection
-\protected_separator
+Interfacing with Assembly Routines
+\layout Subsection
-\protected_separator
+Global Registers used for Parameter Passing
+\layout Standard
-\protected_separator
+By default the compiler uses the global registers
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+DPL,DPH,B,ACC
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ to pass the first parameter to a routine, the second parameter onwards
+ is either allocated on the stack (for reentrant routines or --stack-auto
+ is used) or in the internal / external ram (depending on the memory model).
+
+\layout Subsubsection
-\protected_separator
+Assembler Routine(non-reentrant)
+\layout Standard
-\protected_separator
+In the following example the function
+\series bold
+ cfunc
+\series default
+ calls an assembler routine
+\series bold
+asm_func
+\series default
+, which takes two parameters.
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+extern int asm_func( unsigned short, unsigned short);
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+\SpecialChar ~
-\protected_separator
+\newline
+int c_func (unsigned short i, unsigned short j)
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ return asm_func(i,j);
+\newline
+}
+\size default
+
+\size scriptsize
-\protected_separator
+\newline
+int main()
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c_func(10,9);
+\newline
+}
+\layout Standard
-\protected_separator
+The corresponding assembler function is:-
+\layout Standard
-\protected_separator
-\protected_separator
-buffer point
+\size scriptsize
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func_PARM_2
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .area OSEG
+\newline
+_asm_func_PARM_2:\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .ds\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 1
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .area CSEG
\newline
-;; !
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
-
-\protected_separator
+_asm_func:
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ a,dpl
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ a,_asm_func_PARM_2
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ dpl,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ dpl,#0x00
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ret
+\layout Standard
-\protected_separator
+Note here that the return values are placed in 'dpl' - One byte return value,
+ 'dpl' LSB & 'dph' MSB for two byte values.
+ 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph','
+b' & 'acc' for four byte values.
+\layout Standard
-\protected_separator
+The parameter naming convention is
+\series bold
+_<function_name>_PARM_<n>,
+\series default
+ where n is the parameter number starting from 1, and counting from the
+ left.
+ The first parameter is passed in
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+dpl
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ for One bye parameter,
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+dptr
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ if two bytes,
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
+b,dptr
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ for three bytes and
+\begin_inset Quotes eld
+\end_inset
-\protected_separator
- sdcdbsrc-goto-sdcdb
-\protected_separator
+acc,b,dptr
+\begin_inset Quotes erd
+\end_inset
-\protected_separator
+ for four bytes, the
+\family typewriter
+\series bold
+\size footnotesize
+varaible name for the second parameter will be _<function_name>_PARM_2.
+\layout Standard
-\protected_separator
+Assemble the assembler routine with the following command.
+\layout Standard
-\protected_separator
+asx8051 -losg asmfunc.asm
+\layout Standard
-\protected_separator
+Then compile and link the assembler routine to the C source file with the
+ following command,
+\layout Standard
-\protected_separator
+sdcc cfunc.c asmfunc.rel
+\layout Subsubsection
-\protected_separator
+Assembler Routine(reentrant)
+\layout Standard
-\protected_separator
+In this case the second parameter onwards will be passed on the stack ,
+ the parameters are pushed from right to left i.e.
+ after the call the left most parameter will be on the top of the stack.
+ Here is an example.
+\layout Standard
-\protected_separator
-\protected_separator
-Goto the SDCDB output buffer
-\newline
-;; p
-\protected_separator
+\size footnotesize
+extern int asm_func( unsigned short, unsigned short);
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+\SpecialChar ~
-\protected_separator
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+int c_func (unsigned short i, unsigned short j) reentrant
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ return asm_func(i,j);
+\newline
+}
+\size default
+
+\size scriptsize
-\protected_separator
+\newline
+int main()
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c_func(10,9);
+\newline
+}
+\layout Standard
-\protected_separator
+The corresponding assembler routine is.
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func
+\newline
+_asm_func:
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ push\SpecialChar ~
+ _bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ _bp,sp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+ r2,dpl
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ a,_bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ clr\SpecialChar ~
+ c
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+ a,#0xfd
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ r0,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+ a,#0xfc
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ r1,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ a,@r0
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+ a,r2
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ dpl,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ dph,#0x00
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ sp,_bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ pop\SpecialChar ~
+ _bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ret
+\layout Standard
-\protected_separator
+The compiling and linking procedure remains the same, however note the extra
+ entry & exit linkage required for the assembler code, _bp is the stack
+ frame pointer and is used to compute the offset into the stack for parameters
+ and local variables.
+\layout Subsection
-\protected_separator
+With --noregparms Option
+\layout Standard
-\protected_separator
+When the source is compiled with --noregparms option , space is allocated
+ for each of the parameters passed to a routine.
+\layout Subsubsection
-\protected_separator
- sdcdb-print-c-sexp
-\protected_separator
+Assembler Routine Non-reentrant
+\layout Standard
-\protected_separator
+In the following example the function
+\series bold
+ cfunc
+\series default
+ calls an assembler routine
+\series bold
+asm_func
+\series default
+, which takes two parameters.
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+extern int asm_func( unsigned short, unsigned short);
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+\SpecialChar ~
-\protected_separator
+\newline
+int c_func (unsigned short i, unsigned short j)
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ return asm_func(i,j);
+\newline
+}
+\size default
+
+\size scriptsize
-\protected_separator
+\newline
+int main()
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c_func(10,9);
+\newline
+}
+\layout Standard
-\protected_separator
+The corresponding assembler function is:-
+\layout Standard
-\protected_separator
-\protected_separator
-SDCDB print command for data at
+\size scriptsize
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func_PARM_1
\newline
-;;
-\protected_separator
-
-\protected_separator
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func_PARM_2
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .area OSEG
+\newline
+_asm_func_PARM_1:\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .ds\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 1
+\newline
+_asm_func_PARM_2:\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .ds\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 1
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .area CSEG
+\newline
+_asm_func:
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ a,_asm_func_PARM_1
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ a,_asm_func_PARM_2
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ dpl,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ dpl,#0x00
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ret
+\layout Standard
-\protected_separator
+Note here that the return values are placed in 'dpl' - One byte return value,
+ 'dpl' LSB & 'dph' MSB for two byte values.
+ 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph','
+b' & 'acc' for four byte values.
+\layout Standard
-\protected_separator
+The parameter naming convention is
+\series bold
+_<function_name>_PARM_<n>,
+\series default
+ where n is the parameter number starting from 1, and counting from the
+ left.
+ i.e.
+ the
+\family typewriter
+\series bold
+\size footnotesize
+left-most parameter name will be _<function_name>_PARM_1.
+\layout Standard
-\protected_separator
+Assemble the assembler routine with the following command.
+\layout Standard
-\protected_separator
+asx8051 -losg asmfunc.asm
+\layout Standard
-\protected_separator
+Then compile and link the assembler routine to the C source file with the
+ following command,
+\layout Standard
-\protected_separator
+sdcc cfunc.c asmfunc.rel
+\layout Subsubsection
-\protected_separator
+Assembler Routine(reentrant)
+\layout Standard
-\protected_separator
+In this case the parameters will be passed on the stack , the parameters
+ are pushed from right to left i.e.
+ after the call the left most parameter will be on the top of the stack.
+ Here is an example.
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+extern int asm_func( unsigned short, unsigned short);
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+\SpecialChar ~
-\protected_separator
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+int c_func (unsigned short i, unsigned short j) reentrant
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ return asm_func(i,j);
+\newline
+}
+\size default
+
+\size scriptsize
-\protected_separator
+\newline
+int main()
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c_func(10,9);
+\newline
+}
+\layout Standard
-\protected_separator
+The corresponding assembler routine is.
+\layout Standard
-\protected_separator
-\protected_separator
+\size scriptsize
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ .globl _asm_func
+\newline
+_asm_func:
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ push\SpecialChar ~
+ _bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ _bp,sp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ a,_bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ clr\SpecialChar ~
+ c
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+ a,#0xfd
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ r0,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ a,_bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ clr\SpecialChar ~
+ c
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+ a,#0xfc
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ r1,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ a,@r0
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ add\SpecialChar ~
+ a,@r1
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ dpl,a
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ dph,#0x00
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+ sp,_bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ pop\SpecialChar ~
+ _bp
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ret
+\layout Standard
-\protected_separator
+The compiling and linking procedure remains the same, however note the extra
+ entry & exit linkage required for the assembler code, _bp is the stack
+ frame pointer and is used to compute the offset into the stack for parameters
+ and local variables.
+\layout Subsection
-\protected_separator
+External Stack
+\layout Standard
-\protected_separator
+The external stack is located at the start of the external ram segment ,
+ and is 256 bytes in size.
+ When --xstack option is used to compile the program, the parameters and
+ local variables of all reentrant functions are allocated in this area.
+ This option is provided for programs with large stack space requirements.
+ When used with the --stack-auto option, all parameters and local variables
+ are allocated on the external stack (note support libraries will need to
+ be recompiled with the same options).
+\layout Standard
-\protected_separator
+The compiler outputs the higher order address byte of the external ram segment
+ into PORT P2, therefore when using the External Stack option, this port
+ MAY NOT be used by the application program.
+\layout Subsection
-\protected_separator
+ANSI-Compliance
+\layout Standard
-\protected_separator
+Deviations from the compliancy.
+\layout Enumerate
-\protected_separator
+functions are not always reentrant.
+\layout Enumerate
-\protected_separator
+structures cannot be assigned values directly, cannot be passed as function
+ parameters or assigned to each other and cannot be a return value from
+ a function.
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+eg
+\end_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+struct s { ...
+ };
+\newline
+struct s s1, s2;
+\newline
+foo()
+\newline
+{
+\newline
+...
+
+\newline
+s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */
+\newline
+...
+
+\newline
+}
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+struct s foo1 (struct s parms) /* is invalid in SDCC although allowed in
+ ANSI */
+\newline
+{
+\newline
+struct s rets;
+\newline
+...
+
+\newline
+return rets;/* is invalid in SDCC although allowed in ANSI */
+\newline
+}
+\layout Enumerate
-\protected_separator
+'long long' (64 bit integers) not supported.
+\layout Enumerate
-\protected_separator
+'double' precision floating point not supported.
+\layout Enumerate
-\protected_separator
+integral promotions are suppressed.
+ What does this mean ? The compiler will not implicitly promote an integer
+ expression to a higher order integer, exception is an assignment or parameter
+ passing.
+
+\layout Enumerate
-\protected_separator
+No support for
+\emph on
+setjmp
+\emph default
+ and
+\emph on
+longjmp
+\emph default
+ (for now).
+\layout Enumerate
-\protected_separator
+Old K&R style function declarations are NOT allowed.
+\layout Standard
-\protected_separator
-\protected_separator
- buffer point
+\size footnotesize
+foo( i,j) /* this old style of function declarations */
+\newline
+int i,j; /* are valid in ANSI ..
+ not valid in SDCC */
+\newline
+{
+\newline
+...
+
\newline
-;; g
-\protected_separator
+}
+\layout Enumerate
-\protected_separator
+functions declared as pointers must be dereferenced during the call.
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+int (*foo)();
+\end_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+\SpecialChar ~
+ \SpecialChar ~
+...
+
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+/* has to be called like this */
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+(*foo)();/* ansi standard allows calls to be made like 'foo()' */
+\layout Subsection
-\protected_separator
+Cyclomatic Complexity
+\layout Standard
-\protected_separator
+Cyclomatic complexity of a function is defined as the number of independent
+ paths the program can take during execution of the function.
+ This is an important number since it defines the number test cases you
+ have to generate to validate the function .
+ The accepted industry standard for complexity number is 10, if the cyclomatic
+ complexity reported by SDCC exceeds 10 you should think about simplification
+ of the function logic.
+\layout Standard
-\protected_separator
+Note that the complexity level is not related to the number of lines of
+ code in a function.
+ Large functions can have low complexity, and small functions can have large
+ complexity levels.
+ SDCC uses the following formula to compute the complexity.
+\layout Standard
-\protected_separator
-\protected_separator
+\size small
+complexity = (number of edges in control flow graph) -
+\newline
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+(number of nodes in control flow graph) + 2;
+\layout Standard
-\protected_separator
+Having said that the industry standard is 10, you should be aware that in
+ some cases it may unavoidable to have a complexity level of less than 10.
+ For example if you have switch statement with more than 10 case labels,
+ each case label adds one to the complexity level.
+ The complexity level is by no means an absolute measure of the algorithmic
+ complexity of the function, it does however provide a good starting point
+ for which functions you might look at for further optimization.
+\layout Section
-\protected_separator
+TIPS
+\layout Standard
-\protected_separator
- sdcdbsrc-goto-sdcdb
-\protected_separator
+Here are a few guide-lines that will help the compiler generate more efficient
+ code, some of the tips are specific to this compiler others are generally
+ good programming practice.
+\layout Itemize
-\protected_separator
+Use the smallest data type to represent your data-value.
+ If it is known in advance that the value is going to be less than 256 then
+ use a 'short' or 'char' instead of an 'int'.
+\layout Itemize
-\protected_separator
+Use unsigned when it is known in advance that the value is not going to
+ be negative.
+ This helps especially if you are doing division or multiplication.
+\layout Itemize
-\protected_separator
+NEVER jump into a LOOP.
+\layout Itemize
-\protected_separator
+Declare the variables to be local whenever possible, especially loop control
+ variables (induction).
+\layout Itemize
-\protected_separator
+Since the compiler does not do implicit integral promotion, the programmer
+ should do an explicit cast when integral promotion is required.
+\layout Itemize
-\protected_separator
+Reducing the size of division , multiplication & modulus operations can
+ reduce code size substantially.
+ Take the following code for example.
+\begin_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+foobar( unsigned int p1, unsigned char ch)
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+unsigned char ch1 = p1 % ch ;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+....\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
-\protected_separator
-Goto the SDCDB output buffer
\newline
-;; t
-\protected_separator
+}
+\layout Standard
-\protected_separator
+For the modulus operation the variable ch will be promoted to unsigned int
+ first then the modulus operation will be performed (this will lead to a
+ call to a support routine).
+ If the code is changed to
+\layout Standard
-\protected_separator
-\protected_separator
+\size footnotesize
+foobar( unsigned int p1, unsigned char ch)
+\newline
+{
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+unsigned char ch1 = (unsigned char)p1 % ch ;
+\newline
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+....\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
-\protected_separator
+\newline
+}
+\layout Standard
-\protected_separator
+It would substantially reduce the code generated (future versions of the
+ compiler will be smart enough to detect such optimization oppurtunities).
+\end_deeper
+\layout Standard
-\protected_separator
-\protected_separator
+\series bold
+Notes on MCS51 memory layout(Trefor@magera.freeserve.co.uk)
+\layout Standard
-\protected_separator
+The 8051 family of micro controller have a minimum of 128 bytes of internal
+ memory which is structured as follows
+\layout Standard
-\protected_separator
+- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers R7 to R7
+
+\layout Standard
-\protected_separator
+- Bytes 20-2F - 16 bytes to hold 128 bit variables and
+\layout Standard
-\protected_separator
+- Bytes 30-7F - 60 bytes for general purpose use.
+\layout Standard
-\protected_separator
+Normally the SDCC compiler will only utilise the first bank of registers,
+ but it is possible to specify that other banks of registers should be used
+ in interrupt routines.
+ By default, the compiler will place the stack after the last bank of used
+ registers, i.e.
+ if the first 2 banks of registers are used, it will position the base of
+ the internal stack at address 16 (0X10).
+ This implies that as the stack grows, it will use up the remaining register
+ banks, and the 16 bytes used by the 128 bit variables, and 60 bytes for
+ general purpose use.
+\layout Standard
-\protected_separator
- sdcdbsrc-mode
-\protected_separator
+By default, the compiler uses the 60 general purpose bytes to hold "near
+ data".
+ The compiler/optimiser may also declare some Local Variables in this area
+ to hold local data.
+
+\layout Standard
-\protected_separator
+If any of the 128 bit variables are used, or near data is being used then
+ care needs to be taken to ensure that the stack does not grow so much that
+ it starts to over write either your bit variables or "near data".
+ There is no runtime checking to prevent this from happening.
+\layout Standard
-\protected_separator
+The amount of stack being used is affected by the use of the "internal stack"
+ to save registers before a subroutine call is made, - --stack-auto will
+ declare parameters and local variables on the stack - the number of nested
+ subroutines.
+\layout Standard
-\protected_separator
+If you detect that the stack is over writing you data, then the following
+ can be done.
+ --xstack will cause an external stack to be used for saving registers and
+ (if --stack-auto is being used) storing parameters and local variables.
+ However this will produce more and code which will be slower to execute.
+
+\layout Standard
-\protected_separator
+--stack-loc will allow you specify the start of the stack, i.e.
+ you could start it after any data in the general purpose area.
+ However this may waste the memory not used by the register banks and if
+ the size of the "near data" increases, it may creep into the bottom of
+ the stack.
+\layout Standard
-\protected_separator
+--stack-after-data, similar to the --stack-loc, but it automatically places
+ the stack after the end of the "near data".
+ Again this could waste any spare register space.
+\layout Standard
-\protected_separator
+--data-loc allows you to specify the start address of the near data.
+ This could be used to move the "near data" further away from the stack
+ giving it more room to grow.
+ This will only work if no bit variables are being used and the stack can
+ grow to use the bit variable space.
+\layout Standard
-\protected_separator
+Conclusion.
+\layout Standard
-\protected_separator
+If you find that the stack is over writing your bit variables or "near data"
+ then the approach which best utilised the internal memory is to position
+ the "near data" after the last bank of used registers or, if you use bit
+ variables, after the last bit variable by using the --data-loc, e.g.
+ if two register banks are being used and no data variables, --data-loc
+ 16, and - use the --stack-after-data option.
+\layout Standard
-\protected_separator
+If bit variables are being used, another method would be to try and squeeze
+ the data area in the unused register banks if it will fit, and start the
+ stack after the last bit variable.
+\layout Section
-\protected_separator
+Retargetting for other MCUs.
+\layout Standard
-\protected_separator
+The issues for retargetting the compiler are far too numerous to be covered
+ by this document.
+ What follows is a brief description of each of the seven phases of the
+ compiler and its MCU dependency.
+\layout Enumerate
-\protected_separator
+Parsing the source and building the annotated parse tree.
+ This phase is largely MCU independent (except for the language extensions).
+ Syntax & semantic checks are also done in this phase , along with some
+ initial optimizations like back patching labels and the pattern matching
+ optimizations like bit-rotation etc.
+\layout Enumerate
-\protected_separator
+The second phase involves generating an intermediate code which can be easy
+ manipulated during the later phases.
+ This phase is entirely MCU independent.
+ The intermediate code generation assumes the target machine has unlimited
+ number of registers, and designates them with the name iTemp.
+ The compiler can be made to dump a human readable form of the code generated
+ by using the --dumpraw option.
+\layout Enumerate
-\protected_separator
+This phase does the bulk of the standard optimizations and is also MCU independe
+nt.
+ This phase can be broken down into several sub-phases.
+\begin_deeper
+\layout Itemize
-\protected_separator
-Toggles Sdcdbsrc mode (turns it off)
-\newline
-;;
-\newline
-;; C-c C-f
-\protected_separator
+Break down intermediate code (iCode) into basic blocks.
+\layout Itemize
-\protected_separator
+Do control flow & data flow analysis on the basic blocks.
+\layout Itemize
-\protected_separator
+Do local common subexpression elimination, then global subexpression elimination
+\layout Itemize
-\protected_separator
+dead code elimination
+\layout Itemize
-\protected_separator
+loop optimizations
+\layout Itemize
-\protected_separator
+if loop optimizations caused any changes then do 'global subexpression eliminati
+on' and 'dead code elimination' again.
+\end_deeper
+\layout Enumerate
-\protected_separator
+This phase determines the live-ranges; by live range I mean those iTemp
+ variables defined by the compiler that still survive after all the optimization
+s.
+ Live range analysis is essential for register allocation, since these computati
+on determines which of these iTemps will be assigned to registers, and for
+ how long.
+\layout Enumerate
-\protected_separator
- sdcdb-finish-from-src
-\protected_separator
+Phase five is register allocation.
+ There are two parts to this process .
+\begin_deeper
+\layout Enumerate
-\protected_separator
+The first part I call 'register packing' (for lack of a better term) .
+ In this case several MCU specific expression folding is done to reduce
+ register pressure.
+\layout Enumerate
-\protected_separator
+The second part is more MCU independent and deals with allocating registers
+ to the remaining live ranges.
+ A lot of MCU specific code does creep into this phase because of the limited
+ number of index registers available in the 8051.
+\end_deeper
+\layout Enumerate
-\protected_separator
+The Code generation phase is (unhappily), entirely MCU dependent and very
+ little (if any at all) of this code can be reused for other MCU.
+ However the scheme for allocating a homogenized assembler operand for each
+ iCode operand may be reused.
+\layout Enumerate
-\protected_separator
+As mentioned in the optimization section the peep-hole optimizer is rule
+ based system, which can reprogrammed for other MCUs.
+\layout Section
-\protected_separator
+SDCDB - Source Level Debugger
+\layout Standard
-\protected_separator
+SDCC is distributed with a source level debugger.
+ The debugger uses a command line interface, the command repertoire of the
+ debugger has been kept as close to gdb ( the GNU debugger) as possible.
+ The configuration and build process is part of the standard compiler installati
+on, which also builds and installs the debugger in the target directory
+ specified during configuration.
+ The debugger allows you debug BOTH at the C source and at the ASM source
+ level.
+\layout Subsection
-\protected_separator
-SDCDB finish command
-\newline
-;;
-\newline
-;; C-x SPC
-\protected_separator
+Compiling for Debugging
+\layout Standard
-\protected_separator
+The
+\emph on
+--debug
+\emph default
+ option must be specified for all files for which debug information is to
+ be generated.
+ The complier generates a
+\emph on
+.cdb
+\emph default
+ file for each of these files.
+ The linker updates the
+\emph on
+.cdb
+\emph default
+ file with the address information.
+ This .cdb is used by the debugger .
+\layout Subsection
-\protected_separator
+How the Debugger Works
+\layout Standard
-\protected_separator
+When the
+\emph on
+--debug
+\emph default
+ option is specified the compiler generates extra symbol information some
+ of which are put into the the assembler source and some are put into the
+ .cdb file, the linker updates the .cdb file with the address information
+ for the symbols.
+ The debugger reads the symbolic information generated by the compiler &
+ the address information generated by the linker.
+ It uses the SIMULATOR (Daniel's S51) to execute the program, the program
+ execution is controlled by the debugger.
+ When a command is issued for the debugger, it translates it into appropriate
+ commands for the simulator .
+\layout Subsection
-\protected_separator
+Starting the Debugger
+\layout Standard
-\protected_separator
+The debugger can be started using the following command line.
+ (Assume the file you are debugging has
+\layout Standard
-\protected_separator
+the file name foo).
+\layout Standard
-\protected_separator
- sdcdb-break
-\protected_separator
+>sdcdb foo
+\layout Standard
-\protected_separator
+The debugger will look for the following files.
+\layout Enumerate
-\protected_separator
+foo.c - the source file.
+\layout Enumerate
-\protected_separator
+foo.cdb - the debugger symbol information file.
+\layout Enumerate
-\protected_separator
+foo.ihx - the intel hex format object file.
+\layout Subsection
-\protected_separator
+Command Line Options.
+\layout Itemize
-\protected_separator
+--directory=<source file directory> this option can used to specify the
+ directory search list.
+ The debugger will look into the directory list specified for source , cdb
+ & ihx files.
+ The items in the directory list must be separated by ':' , e.g.
+ if the source files can be in the directories /home/src1 and /home/src2,
+ the --directory option should be --directory=/home/src1:/home/src2 .
+ Note there can be no spaces in the option.
+
+\layout Itemize
-\protected_separator
+-cd <directory> - change to the <directory>.
+\layout Itemize
-\protected_separator
+-fullname - used by GUI front ends.
+\layout Itemize
-\protected_separator
+-cpu <cpu-type> - this argument is passed to the simulator please see the
+ simulator docs for details.
+\layout Itemize
-\protected_separator
+-X <Clock frequency > this options is passed to the simulator please see
+ simulator docs for details.
+\layout Itemize
-\protected_separator
+-s <serial port file> passed to simulator see simulator docs for details.
+\layout Itemize
-\protected_separator
+-S <serial in,out> passed to simulator see simulator docs for details.
+\layout Subsection
-\protected_separator
+Debugger Commands.
+\layout Standard
-\protected_separator
+As mention earlier the command interface for the debugger has been deliberately
+ kept as close the GNU debugger gdb , as possible, this will help int integratio
+n with existing graphical user interfaces (like ddd, xxgdb or xemacs) existing
+ for the GNU debugger.
+\layout Subsubsection
-\protected_separator
+break [line | file:line | function | file:function]
+\layout Standard
-\protected_separator
+Set breakpoint at specified line or function.
+\layout Standard
-\protected_separator
-Set break for line with point
+sdcdb>break 100
+\newline
+sdcdb>break foo.c:100
\newline
-;; ESC t
-\protected_separator
+sdcdb>break funcfoo
+\newline
+sdcdb>break foo.c:funcfoo
+\layout Subsubsection
-\protected_separator
+clear [line | file:line | function | file:function ]
+\layout Standard
-\protected_separator
+Clear breakpoint at specified line or function.
+\layout Standard
-\protected_separator
+sdcdb>clear 100
+\newline
+sdcdb>clear foo.c:100
+\newline
+sdcdb>clear funcfoo
+\newline
+sdcdb>clear foo.c:funcfoo
+\layout Subsubsection
-\protected_separator
+continue
+\layout Standard
-\protected_separator
+Continue program being debugged, after breakpoint.
+\layout Subsubsection
-\protected_separator
+finish
+\layout Standard
-\protected_separator
+Execute till the end of the current function.
+\layout Subsubsection
-\protected_separator
+delete [n]
+\layout Standard
-\protected_separator
- sdcdbsrc-mode
-\protected_separator
+Delete breakpoint number 'n'.
+ If used without any option clear ALL user defined break points.
+\layout Subsubsection
-\protected_separator
+info [break | stack | frame | registers ]
+\layout Itemize
-\protected_separator
+info break - list all breakpoints
+\layout Itemize
-\protected_separator
+info stack - show the function call stack.
+\layout Itemize
-\protected_separator
+info frame - show information about the current execution frame.
+\layout Itemize
-\protected_separator
+info registers - show content of all registers.
+\layout Subsubsection
-\protected_separator
+step
+\layout Standard
-\protected_separator
+Step program until it reaches a different source line.
+\layout Subsubsection
-\protected_separator
+next
+\layout Standard
-\protected_separator
+Step program, proceeding through subroutine calls.
+\layout Subsubsection
-\protected_separator
+run
+\layout Standard
-\protected_separator
+Start debugged program.
+\layout Subsubsection
-\protected_separator
+ptype variable
+\layout Standard
-\protected_separator
+Print type information of the variable.
+\layout Subsubsection
-\protected_separator
+print variable
+\layout Standard
-\protected_separator
-Toggle Sdcdbsrc mode
-\newline
-;; ESC m
-\protected_separator
+print value of variable.
+\layout Subsubsection
-\protected_separator
+file filename
+\layout Standard
-\protected_separator
+load the given file name.
+ Note this is an alternate method of loading file for debugging.
+\layout Subsubsection
-\protected_separator
+frame
+\layout Standard
-\protected_separator
+print information about current frame.
+\layout Subsubsection
-\protected_separator
+set srcmode
+\layout Standard
-\protected_separator
+Toggle between C source & assembly source.
+\layout Subsubsection
-\protected_separator
+! simulator command
+\layout Standard
-\protected_separator
+Send the string following '!' to the simulator, the simulator response is
+ displayed.
+ Note the debugger does not interpret the command being sent to the simulator,
+ so if a command like 'go' is sent the debugger can loose its execution
+ context and may display incorrect values.
+\layout Subsubsection
-\protected_separator
- sdcdbsrc-srcmode
-\protected_separator
+quit.
+\layout Standard
-\protected_separator
+"Watch me now.
+ Iam going Down.
+ My name is Bobby Brown"
+\layout Subsection
-\protected_separator
+Interfacing with XEmacs.
+\layout Standard
-\protected_separator
+Two files are (in emacs lisp) are provided for the interfacing with XEmacs,
+\emph on
+ sdcdb.el
+\emph default
+ and
+\emph on
+sdcdbsrc.el
+\emph default
+.
+ These two files can be found in the $(prefix)/bin directory after the installat
+ion is complete.
+ These files need to be loaded into XEmacs for the interface to work, this
+ can be done at XEmacs startup time by inserting the following into your
+
+\emph on
+'.xemacs'
+\emph default
+ file (which can be found in your HOME directory)
+\emph on
+(load-file sdcdbsrc.el)
+\emph default
+[ .xemacs is a lisp file so the () around the command is REQUIRED), the files
+ can also be loaded dynamically while XEmacs is running, set the environment
+ variable
+\emph on
+'EMACSLOADPATH'
+\emph default
+to the installation bin directory [$(prefix)/bin], then enter the following
+ command
+\emph on
+ESC-x load-file sdcdbsrc .
+
+\emph default
+To start the interface enter the following command
+\emph on
+ESC-x sdcdbsrc
+\emph default
+ , you will prompted to enter the file name to be debugged.
+
+\layout Standard
-\protected_separator
+The command line options that are passed to the simulator directly are bound
+ to default values in the file
+\emph on
+sdcdbsrc.el
+\emph default
+the variables are listed below these values maybe changed as required.
+\layout Itemize
-\protected_separator
+sdcdbsrc-cpu-type '51
+\layout Itemize
-\protected_separator
+sdcdbsrc-frequency '11059200
+\layout Itemize
-\protected_separator
+sdcdbsrc-serial nil
+\layout Standard
-\protected_separator
+The following is a list of key mapping for the debugger interface.
+\layout Standard
-\protected_separator
+\SpecialChar ~
-\protected_separator
+\size scriptsize
-\protected_separator
+\newline
+;; Current Listing ::
+\newline
+;;key\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+binding\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Comment
+\newline
+;;---\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+-------\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+-------
+\newline
+;;
+\newline
+;; n\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-next-from-src\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB next command
+\newline
+;; b\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-back-from-src\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB back command
+\newline
+;; c\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-cont-from-src\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB continue command
+\newline
+;; s\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-step-from-src\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB step command
+\newline
+;; ?\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-whatis-c-sexp\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB ptypecommand for data at
+\newline
+;;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ buffer point
+\newline
+;; x\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-delete\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB Delete all breakpoints if no arg
+\newline
+;;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+given or delete arg (C-u arg x)
+\newline
+;; m\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-frame\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB Display current frame if no arg,
+\newline
+;;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+given or display frame arg
+\newline
+;;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+buffer point
+\newline
+;; !\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-goto-sdcdb\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Goto the SDCDB output buffer
+\newline
+;; p\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-print-c-sexp\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB print command for data at
+\newline
+;;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ buffer point
+\newline
+;; g\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-goto-sdcdb\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Goto the SDCDB output buffer
+\newline
+;; t\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-mode\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Toggles Sdcdbsrc mode (turns it off)
+\newline
+;;
+\newline
+;; C-c C-f\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-finish-from-src\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB finish command
+\newline
+;;
+\newline
+;; C-x SPC\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-break\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Set break for line with point
+\newline
+;; ESC t\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-mode\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Toggle Sdcdbsrc mode
+\newline
+;; ESC m\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-srcmode\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
Toggle list mode
\newline
;;
\layout Section
-Conclusion
-\begin_inset LatexCommand \label{Conclusion}
-
-\end_inset
-
+Other Processors
+\layout Subsection
+The Z80 and gbz80 port
\layout Standard
-SDCC is a large project , the compiler alone (without the Assembler Package
- , Preprocessor & garbage collector) is about 40,000 lines of code (blank
- stripped).
- As with any project of this size there are bound to be bugs, I am more
- than willing to work to fix these bugs , of course all the source code
- is included with the package.
-
+SDCC can target both the Zilog Z80 and the Nintendo Gameboy's Z80-like gbz80.
+ The port is incomplete - long support is incomplete (mul, div and mod are
+ unimplimented), and both float and bitfield support is missing, but apart
+ from that the code generated is correct.
\layout Standard
-Where does it go from here ? I am planning to target the Atmel AVR 8-bit
- MCUs which seems to have a lot of users.
- I am also planning to include an alias analysis system with this compiler
- (it does not currently have one).
+As always, the code is the authoritave reference - see z80/ralloc.c and z80/gen.c.
+ The stack frame is similar to that generated by the IAR Z80 compiler.
+ IX is used as the base pointer, HL is used as a temporary register, and
+ BC and DE are available for holding varibles.
+ IY is currently unusued.
+ Return values are stored in HL.
+ One bad side effect of using IX as the base pointer is that a functions
+ stack frame is limited to 127 bytes - this will be fixed in a later version.
\layout Section
-Acknowledgments
-\begin_inset LatexCommand \label{Acknowledgements}
+Support
+\layout Standard
-\end_inset
+SDCC has grown to be large project, the compiler alone (without the Assembler
+ Package, Preprocessor) is about 40,000 lines of code (blank stripped).
+ The open source nature of this project is a key to its continued growth
+ and support.
+ You gain the benefit and support of many active software developers and
+ end users.
+ Is SDCC perfect? No, that's why we need your help.
+ The developers take pride in fixing reported bugs.
+ 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.
+\layout Subsection
+Reporting Bugs
+\layout Standard
+
+Send an email to the mailing list at 'user-sdcc@sdcc.sourceforge.net' or 'devel-sd
+cc@sdcc.sourceforge.net'.
+ Bugs will be fixed ASAP.
+ When reporting a bug, it is very useful to include a small test program
+ which reproduces the problem.
+ If you can isolate the problem by looking at the generated assembly code,
+ this can be very helpful.
+ Compiling your program with the --dumpall option can sometimes be useful
+ in locating optimization problems.
+\layout Subsection
+Acknowledgments
\layout Standard
+Sandeep Dutta(sandeep.dutta@usa.net) - SDCC, the compiler, MCS51 code generator,
+ Debugger, AVR port
+\newline
Alan Baldwin (baldwin@shop-pdp.kent.edu) - Initial version of ASXXXX & ASLINK.
-\layout Standard
-
+\newline
John Hartman (jhartman@compuserve.com) - Porting ASXXX & ASLINK for 8051
-\layout Standard
-
+\newline
Dmitry S.
Obukhov (dso@usa.net) - malloc & serial i/o routines.
-\layout Standard
-
+\newline
Daniel Drotos <drdani@mazsola.iit.uni-miskolc.hu> - for his Freeware simulator
-\layout Standard
-
-Jans J Boehm(boehm@sgi.com) and Alan J Demers - Conservative garbage collector
- for C & C++.
-\layout Standard
-
+\newline
Malini Dutta(malini_dutta@hotmail.com) - my wife for her patience and support.
-\layout Standard
-
+\newline
Unknown - for the GNU C - preprocessor.
-\layout Section
-
-Appendix A: The Z80 and gbz80 port
-\layout Standard
+\newline
+Michael Hope - The Z80 and Z80GB port, 186 development
+\newline
+Kevin Vigor - The DS390 port.
+\newline
+Johan Knol - DS390/TINI libs, lots of fixes and enhancements.
+\newline
+Scott Datallo - PIC port.
+\newline
+(Thanks to all the other volunteer developers who have helped with coding,
+ testing, web-page creation, distribution sets, etc.
+ You know who you are :-)
+\newline
-2.2.0 can target both the Zilog Z80 and the Nintendo Gameboy's Z80-like gbz80.
- The port is incomplete - long support is incomplete (mul, div and mod are
- unimplimented), and both float and bitfield support is missing, but apart
- from that the code generated is correct.
\layout Standard
-As always, the code is the authoritave reference - see z80/ralloc.c and z80/gen.c.
- The stack frame is similar to that generated by the IAR Z80 compiler.
- IX is used as the base pointer, HL is used as a temporary register, and
- BC and DE are available for holding varibles.
- IY is currently unusued.
- Return values are stored in HL.
- One bad side effect of using IX as the base pointer is that a functions
- stack frame is limited to 127 bytes - this will be fixed in a later version.bc
+This document initially written by Sandeep Dutta
\layout Standard
-9
+All product names mentioned herein may be trademarks of their respective
+ companies.
+
\layout Standard