#This file was created by <sandeep> Sun Mar 26 12:40:23 2000
#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team
\lyxformat 2.15
\textclass linuxdoc
\language english
\inputencoding default
\fontscheme default
\graphics default
\paperfontsize default
\spacing single 
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default

\layout Title

SDCC Compiler User Guide
\layout Author

Sandeep Dutta (sandeep.dutta@usa.net)
\layout Section

Introduction
\layout Standard

SDCC is a Free ware , retargettable, optimizing ANSI-C compiler.
 The current version targets Intel 8051 based MCUs, it can be retargetted
 for other 8 bit MCUs or PICs.
 The entire source code for the compiler is distributed under GPL.
 SDCC used ASXXXX & ASLINK a Free ware, 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
 standard optimizations like
\emph on 
 global sub expression elimination, loop optimizations (loop invariant,
 strength reduction of induction variables and loop reversing), constant
 folding & propagation, copy propagation, dead code elimination and jumptables
 for 'switch' statements.
 
\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.
 Supported data-types are 
\emph on 
short (8 bits, 1 byte), char (8 bits, 1 byte), int (16 bits, 2 bytes ),
 long (32 bit, 4 bytes) & float (4 byte IEEE).
 
\emph default 
The compiler also allows 
\emph on 
inline assembler code
\emph default 
 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
 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.
 The latest version can be downloaded from 
\series bold 
http://www.geocities.com/ResearchTriangle/Forum/1353
\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).
 
\layout Standard

This program is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by the Free
 Software Foundation; either version 2, or (at your option) any later version.
 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 You should have received a copy of the GNU General Public License along
 with this program; if not, write to the Free Software Foundation, 59 Temple
 Place - Suite 330, Boston, MA 02111-1307, USA.
 In other words, you are welcome to use, share and improve this program.
 You are forbidden to forbid anyone else to use, share and improve what
 you give them.
 Help stamp out software-hoarding! 
\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 95/NT
\emph default 
 go to 
\emph on 
www.cygnus.com
\emph default 
 and download 
\emph on 
CYGWIN32
\emph default 
 you will need the full development version of their tool (
\emph on 
full.exe)
\emph default 
, follow their instructions for installation (this is also free and is very
 easy to install), 
\emph on 
Windows
\emph default 
 
\emph on 
95/NT 
\emph default 
users be aware that the compiler runs substantially slower on the Windows
 platform, I am not sure why.
\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.
\layout Subsection

Components of SDCC
\begin_inset LatexCommand \label{Components}

\end_inset 


\layout Subsubsection

gc ( a conservative garbage collector)
\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 preprocessor is extracted into the directory 
\emph on 
SDCCDIR/cpp
\emph default 
, it is a modified version of the GNU preprocessor.
\layout Subsubsection

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

SDCC - The compiler.
\layout Standard

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

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

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

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 Verbatim

./sdccbuild.sh
\layout Standard

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

Installation for Version >= 2.1.8a
\layout Standard

The distribution method from Version 2.1.8a has been changed to be conforment
 with the 
\begin_inset Quotes eld
\end_inset 

autoconf
\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

Unpack the sources.
\layout Standard

This is usually done by the following command 
\begin_inset Quotes eld
\end_inset 


\series bold 
\size large 
\emph on 
gunzip -c sdcc-<version number>.tar.gz | tar -xv -
\series default 
\size default 
\emph default 

\begin_inset Quotes eld
\end_inset 


\layout Subsubsection

Change to the main source directory (usually sdcc or sdcc-<version number>)
\layout Subsubsection

Issue command to configure your system
\layout Standard

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.
\layout Verbatim

bin/ - binary exectables (add to PATH environment variable) 
\newline 
share/ 
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
sdcc51inc/ - include header files 
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
sdcc51lib/ - 
\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 
small/ - Object & Library files for small model library 
\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 
large/ - Object & library files for large model library
\layout Standard

The command 
\layout Standard


\series bold 
\size large 
\bar under 
'./configure --prefix=/usr/local
\begin_inset Quotes erd
\end_inset 

 
\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 
\layout Standard


\series bold 
\size large 
\bar under 

\begin_inset Quotes eld
\end_inset 

make
\begin_inset Quotes erd
\end_inset 


\layout Standard

This will compile the compiler
\layout Subsubsection


\begin_inset Quotes eld
\end_inset 

make install
\begin_inset Quotes erd
\end_inset 


\layout Standard

Will install the compiler and libraries in the appropriate directories.
\layout Subsubsection

Special Notes for Windows Users.
 Provided by Michael Jamet[ mjamet@computer.org] 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 How to install SDCC from source on a Windows 95 or Windows NT 4 system
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 This document describes how to install SDCC on a Win 95 or Win NT 4 system.
 
\layout Standard


\protected_separator 
 These instructions probably work for Win 98 as well, but have not been
 
\layout Standard


\protected_separator 
 tested on that platform.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 There are lots of little differences between UNIX and the Win32 Cygnus
 
\layout Standard


\protected_separator 
 environment which make porting more difficult than it should be.
\protected_separator 
 If 
\layout Standard


\protected_separator 
 you want the details, please contact me.
\protected_separator 
 Otherwise just follow these 
\layout Standard


\protected_separator 
 instructions.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 1.
 Install the Cygnus Software 
\layout Standard


\protected_separator 
 Go to http://sourceware.cygnus.com/cygwin.
\protected_separator 
 Cygnus provides a UNIX like 
\layout Standard


\protected_separator 
 environment for Win 32 systems.
\protected_separator 
 Download "full.exe" and install.
\protected_separator 
 You 
\layout Standard


\protected_separator 
 MUST install it on your C drive.
\protected_separator 
 "full.exe" contains a shell AND many 
\layout Standard


\protected_separator 
 common UNIX utilities.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 2.
 Download and Extract the Latest SDCC 
\layout Standard


\protected_separator 
 The latest version can be found at 
\layout Standard


\protected_separator 

\protected_separator 
 www.geocities.com/ResearchTriange/Forum/1353.
 
\layout Standard


\protected_separator 
 It can be uncompressed with winzip.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 3.
\protected_separator 
 Start a Cygnus Shell 
\layout Standard


\protected_separator 
 There should be an entry in the Start Menu for Cygnus.
\protected_separator 
 Invoke the shell.
 
\layout Standard


\protected_separator 
 This gives you a UNIX like environment.
\protected_separator 
 FROM THIS POINT ON, DIRECTORIES 
\layout Standard


\protected_separator 
 MUST BE SPECIFIED WITH FORWARD SLASHES (/) NOT THE DOS STYLE BACK 
\layout Standard


\protected_separator 
 SLASHES (
\backslash 
) BECAUSE THIS IS WHAT UNIX EXPECTS.
\protected_separator 
 - 
\layout Standard


\protected_separator 

\protected_separator 
 ex.
 "
\backslash 
winnt" would be "/winnt" under the shell.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 4.
 Change Directory to Where SDCC was extracted (referred to as INSTALLDIR)
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 ex.
 cd /sdcc218Da.
\protected_separator 
 If you extracted to a drive OTHER THAN C, the drive 
\layout Standard


\protected_separator 
 must be specified as part of the path.
 For example, if you extracted to 
\layout Standard


\protected_separator 
 your "g drive", type the following: "cd //g/mydir".
\protected_separator 
 You must use "//" 
\layout Standard


\protected_separator 
 to specify the drive.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 5.
 Make Dirs Which are Automatically Made During the UNIX Installation 
\layout Standard


\protected_separator 
 From the INSTALLDIR, 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p bin
\protected_separator 

\protected_separator 
 (not a typo, just "bin") 
\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p /bin 
\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p /usr/local/bin 
\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p /usr/local/share 
\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p /usr/local/share/sdcc51lib 
\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p /usr/local/share/sdcc51inc 
\layout Standard


\protected_separator 

\protected_separator 
 mkdir -p /tmp 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 (When a path from the root directory is specified WITHOUT a drive, the
 
\layout Standard


\protected_separator 
 drive defaults to c.
\protected_separator 
 For example /michael/newuser => c:
\backslash 
michael
\backslash 
newuser) 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 6.
\protected_separator 
 Add Programs to /bin Expected by the Installation Process 
\layout Standard


\protected_separator 

\protected_separator 
 - Look at your path: echo $PATH 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 One of the fields is the diretory with the CYGNUS programs.
 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 
 ex.
 /CYGNUS/CYGWIN~1/H-I586/BIN 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 

\protected_separator 
 - cd to the directory found above.
\protected_separator 
 You may have to fiddle with the 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 case (upper or lower) here because the PATH is SHOWN as all upper 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 case, but is actually mixed.
\protected_separator 
 To help you along, you may type 
\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 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 out the remaining letters IF THEY describe a unique directory.
 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 If you have problems here, cd one directory and type "ls".
\protected_separator 
 "ls" 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 is the equivalent of "dir/w".
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 

\protected_separator 
 - Copy the following: 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 
 cp sh.exe /bin 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 
 cp pwd.exe /bin 
\layout Standard


\protected_separator 

\protected_separator 

\protected_separator 
 cp echo.exe /bin 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 7.
 Go back to the INSTALLDIR 
\layout Standard


\protected_separator 

\protected_separator 
 cd INSTALLDIR 
\layout Standard


\protected_separator 
 ex.
 cd //d/sdcc218Da 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 8.
 Run the configure Program 
\layout Standard


\protected_separator 

\protected_separator 
 ./configure 
\layout Standard


\protected_separator 
 The "./" is important because your current directory is NOT in your path.
 
\layout Standard


\protected_separator 
 Under DOS, your current directory was implicitly always the first entry
 
\layout Standard


\protected_separator 
 in your path.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 9.
 Run make 
\layout Standard


\protected_separator 

\protected_separator 
 make 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 This process takes quite some time under Win 32.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 10.
 Install the Newly Built Software 
\layout Standard


\protected_separator 

\protected_separator 
 make install 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 This will partially install the software into the /usr/local directories
 
\layout Standard


\protected_separator 
 created in step 5.
\protected_separator 
 What it actually doing is copying the .c, .h and 
\layout Standard


\protected_separator 
 library files to directories under /usr/local/share.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 It will NOT be able to install the actual programs (binaries) because 
\layout Standard


\protected_separator 
 it does not know programs on Win32 systems have ".exe" extensions.
 
\layout Standard


\protected_separator 
 For example, it tries to install sdcc instead of sdcc.exe.
 
\layout Standard


\protected_separator 

\layout Standard


\protected_separator 
 After the automated part is finished, you must manually copy the binaries:
 
\layout Standard


\protected_separator 

\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 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 Verbatim


\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 Verbatim


\size footnotesize 
foo1.c ( contains some functions )
\layout Verbatim


\size footnotesize 
foo2.c (contains some more functions)
\layout Verbatim


\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 Verbatim


\size footnotesize 
sdcc -c foo1.c
\layout Verbatim


\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 Verbatim


\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 Verbatim


\size footnotesize 
sdcc -c foomain.c 
\layout Verbatim


\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 Verbatim


\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


\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 for Small Model programs see section Memory Models for more
 details.
 This is the default model.
\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 Verbatim


\size small 
i = x + y + 1; 
\size default 

\newline 
j 
\size small 
= x + y;
\layout Standard

will be translated to
\layout Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\size small 
for (i = 0 ; i < 100 ; i ++) 
\newline 

\protected_separator 
 
\protected_separator 
 
\protected_separator 
f += k + l;
\layout Standard

changed to
\layout Verbatim


\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 Verbatim


\size small 
for (i=0;i < 100; i++) ar[i*5] = i*3;
\layout Standard

changed to
\layout Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\size small 
switch (i) { 
\newline 
case 1: ...
 
\newline 
case 2: ...
 
\newline 
case 3: ...
 
\newline 
case 4: ...
 
\newline 
}
\layout Verbatim


\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 Verbatim


\size small 
unsigned short i;
\layout Verbatim


\size small 
...
 
\newline 
i>>= 4; 
\newline 
..
\layout Standard

generates the following code.
\layout Verbatim


\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 Verbatim


\size small 
unsigned int i; 
\newline 
...
 
\newline 
i >>= 9; 
\newline 
...
\layout Standard

will generate
\layout Verbatim


\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 Verbatim


\size small 
unsigned char i; 
\newline 
...
 
\newline 
i = ( ( i << 1) | ( i >> 7)); 
\newline 
...
\layout Standard

will generate the following code.
\layout Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\size small 
eg.
\layout Verbatim


\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 Verbatim


\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 Verbatim


\size small 
mov r1,a 
\newline 
mov a,r1
\layout Standard

to
\layout Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\size small 
pop ar1 
\newline 
pop ar2 
\newline 
push ar2 
\newline 
push ar1
\layout Standard

would result in
\layout Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\size small 
/* pointer physically in xternal ram pointing to object in internal ram
 */ 
\newline 
data unsigned char * xdata p;
\newline 

\layout Verbatim


\size small 
/* pointer physically in code rom pointing to data in xdata space */ 
\newline 
xdata unsigned char * code p;
\newline 

\layout Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim

eg.
 
\layout Verbatim


\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 Verbatim


\size small 
eg.
\layout Verbatim


\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 Verbatim


\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 Verbatim

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 Verbatim


\size small 
eg
\layout Verbatim


\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 Verbatim


\size small 
eg
\layout Verbatim


\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, 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

Note that the compiler does not generate any code to place the processor
 into this mode (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.
 However, a current limitation is that the compiler will spill variables
 into the DATA segment when it runs out of registers.
 This means that compiling complex code can rapidly fill up the DATA segment.
 This limitation is being worked on, and should be addressed in the next
 release of sdcc.
\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 Verbatim


\size scriptsize 
eg
\layout Verbatim


\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 Verbatim


\size scriptsize 
%[flags][width][b|B|l|L]type
\layout Verbatim


\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 Verbatim


\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
\begin_deeper 
\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 Verbatim


\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);
\end_deeper 
\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 Verbatim


\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 Verbatim


\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 Verbatim


\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 Verbatim

asx8051 -losg asmfunc.asm
\layout Standard

Then compile and link the assembler routine to the C source file with the
 following command,
\layout Verbatim

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 Verbatim


\size footnotesize 

\protected_separator 

\layout Verbatim


\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 Verbatim


\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 Verbatim


\size footnotesize 
extern int asm_func( unsigned short, unsigned short);
\layout Verbatim


\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 Verbatim


\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 Verbatim

asx8051 -losg asmfunc.asm
\layout Standard

Then compile and link the assembler routine to the C source file with the
 following command,
\layout Verbatim

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 Verbatim


\size footnotesize 

\protected_separator 

\layout Verbatim


\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 Verbatim


\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 

\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 Section

External Stack.
\begin_inset LatexCommand \label{xstack}

\end_inset 


\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

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}

\end_inset 


\layout Standard

Deviations from the compliancy.
\layout Enumerate

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 Verbatim


\size small 
eg
\end_deeper 
\layout Verbatim


\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 Verbatim


\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

'long long' (64 bit integers) not supported.
\layout Enumerate

'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.
 
\layout Enumerate

No support for 
\emph on 
setjmp
\emph default 
 and 
\emph on 
longjmp
\emph default 
 (for now).
\layout Enumerate

Old K&R style function declarations are NOT allowed.
\layout Verbatim


\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 
}
\layout Enumerate

functions declared as pointers must be dereferenced during the call.
\begin_deeper 
\layout Verbatim


\size small 
int (*foo)();
\end_deeper 
\layout Verbatim


\size small 

\protected_separator 
 
\protected_separator 
...
 
\newline 

\protected_separator 
 
\protected_separator 
/* has to be called like this */ 
\newline 

\protected_separator 
 
\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

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 Verbatim


\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

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}

\end_inset 


\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

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

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

NEVER jump into a LOOP.
\layout Itemize

Declare the variables to be local whenever possible, especially loop control
 variables (induction).
\layout Itemize

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 Verbatim


\size footnotesize 
foobar( unsigned int p1, unsigned char ch)
\newline 
{
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
unsigned char ch1 = p1 % ch ;
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
....
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\newline 
}
\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 
\layout Verbatim


\size footnotesize 
foobar( unsigned int p1, unsigned char ch)
\newline 
{
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
unsigned char ch1 = (unsigned char)p1 % ch ;
\newline 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
....
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\newline 
}
\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 
\layout Standard


\series bold 
Notes from an USER ( Trefor@magera.freeserve.co.uk )
\layout Standard

The 8051 family of micro controller have a minimum of 128 bytes of internal
 memory which is structured as follows
\layout Standard

- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers R7 to R7
 
\layout Standard

- Bytes 20-2F - 16 bytes to hold 128 bit variables and 
\layout Standard

- Bytes 30-7F - 60 bytes for general purpose use.
\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

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

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.
 
\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

--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

Conclusion.
\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.
\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 


\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

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

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

Do control flow & data flow analysis on the basic blocks.
\layout Itemize

Do local common subexpression elimination, then global subexpression elimination
\layout Itemize

dead code elimination
\layout Itemize

loop optimizations
\layout Itemize

if loop optimizations caused any changes then do 'global subexpression eliminati
on' and 'dead code elimination' again.
\end_deeper 
\layout Enumerate

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

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 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

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

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}

\end_inset 


\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.
\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 

 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.
\layout Standard

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

How the debugger works.
\layout Standard

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

Starting the debugger.
\layout Standard

The debugger can be started using the following command line.
 (Assume the file you are debugging has
\layout Standard

the file name foo).
\layout Verbatim

>sdcdb foo
\layout Standard

The debugger will look for the following files.
\layout Enumerate

foo.c - the source file.
\layout Enumerate

foo.cdb - the debugger symbol information file.
\layout Enumerate

foo.ihx - the intel hex format object file.
\layout Subsection

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.
 
\layout Itemize

-cd <directory> - change to the <directory>.
\layout Itemize

-fullname - used by GUI front ends.
\layout Itemize

-cpu <cpu-type> - this argument is passed to the simulator please see the
 simulator docs for details.
\layout Itemize

-X <Clock frequency > this options is passed to the simulator please see
 simulator docs for details.
\layout Itemize

-s <serial port file> passed to simulator see simulator docs for details.
\layout Itemize

-S <serial in,out> passed to simulator see simulator docs for details.
\layout Subsection

Debugger Commands.
\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

break [line | file:line | function | file:function]
\layout Standard

Set breakpoint at specified line or function.
\layout Verbatim

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 ]
\layout Standard

Clear breakpoint at specified line or function.
\layout Verbatim

sdcdb>clear 100
\newline 
sdcdb>clear foo.c:100
\newline 
sdcdb>clear funcfoo
\newline 
sdcdb>clear foo.c:funcfoo
\layout Subsubsection

continue
\layout Standard

Continue program being debugged, after breakpoint.
\layout Subsubsection

finish
\layout Standard

Execute till the end of the current function.
\layout Subsubsection

delete [n]
\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

info break - list all breakpoints
\layout Itemize

info stack - show the function call stack.
\layout Itemize

info frame - show information about the current execution frame.
\layout Itemize

info registers - show content of all registers.
\layout Subsubsection

step
\layout Standard

Step program until it reaches a different source line.
\layout Subsubsection

next
\layout Standard

Step program, proceeding through subroutine calls.
\layout Subsubsection

run
\layout Standard

Start debugged program.
\layout Subsubsection

ptype variable 
\layout Standard

Print type information of the variable.
\layout Subsubsection

print variable
\layout Standard

print value of variable.
\layout Subsubsection

file filename
\layout Standard

load the given file name.
 Note this is an alternate method of loading file for debugging.
\layout Subsubsection

frame
\layout Standard

print information about current frame.
\layout Subsubsection

set srcmode
\layout Standard

Toggle between C source & assembly source.
\layout Subsubsection

! 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

quit.
\layout Standard

"Watch me now.
 Iam going Down.
 My name is Bobby Brown"
\layout Subsection

Interfacing with XEmacs.
\layout Standard

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

sdcdbsrc-cpu-type '51
\layout Itemize

sdcdbsrc-frequency '11059200
\layout Itemize

sdcdbsrc-serial nil
\layout Standard

The following is a list of key mapping for the debugger interface.
\layout Verbatim


\protected_separator 

\size scriptsize 

\newline 
;; Current Listing :: 
\newline 
;;key
\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 
binding
\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 
Comment 
\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 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
------- 
\newline 
;; 
\newline 
;; n
\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 
 sdcdb-next-from-src
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB next command 
\newline 
;; b
\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 
 sdcdb-back-from-src
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB back command 
\newline 
;; c
\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 
 sdcdb-cont-from-src
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB continue command
\newline 
;; s
\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 
 sdcdb-step-from-src
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB step command 
\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 
 sdcdb-whatis-c-sexp
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB ptypecommand for data at 
\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 

\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 
 buffer point 
\newline 
;; x
\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 
 sdcdbsrc-delete
\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 
SDCDB Delete all breakpoints if no arg 
\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 

\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 
given or delete arg (C-u arg x) 
\newline 
;; m
\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 
 sdcdbsrc-frame
\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 
SDCDB Display current frame if no arg, 
\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 

\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 
given or display frame arg 
\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 

\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 
buffer point 
\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 
 sdcdbsrc-goto-sdcdb
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
Goto the SDCDB output buffer 
\newline 
;; p
\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 
 sdcdb-print-c-sexp
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB print command for data at 
\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 

\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 
 buffer point 
\newline 
;; g
\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 
 sdcdbsrc-goto-sdcdb
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
Goto the SDCDB output buffer 
\newline 
;; t
\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 
 sdcdbsrc-mode
\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 
Toggles Sdcdbsrc mode (turns it off) 
\newline 
;; 
\newline 
;; C-c C-f
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 sdcdb-finish-from-src
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
SDCDB finish command 
\newline 
;; 
\newline 
;; C-x SPC
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 sdcdb-break
\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 
Set break for line with point 
\newline 
;; ESC t
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 sdcdbsrc-mode
\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 
Toggle Sdcdbsrc mode 
\newline 
;; ESC m
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 sdcdbsrc-srcmode
\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 

\protected_separator 
 Toggle list mode 
\newline 
;; 
\newline 

\layout Section

Conclusion
\begin_inset LatexCommand \label{Conclusion}

\end_inset 


\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.
 
\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).
\layout Section

Acknowledgments
\begin_inset LatexCommand \label{Acknowledgements}

\end_inset 


\layout Standard

Alan Baldwin (baldwin@shop-pdp.kent.edu) - Initial version of ASXXXX & ASLINK.
 
\layout Standard

John Hartman (jhartman@compuserve.com) - Porting ASXXX & ASLINK for 8051
\layout Standard

Dmitry S.
 Obukhov (dso@usa.net) - malloc & serial i/o routines.
 
\layout Standard

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

Malini Dutta(malini_dutta@hotmail.com) - my wife for her patience and support.
\layout Standard

Unknown - for the GNU C - preprocessor.
\layout Section

Appendix A: The Z80 and gbz80 port
\layout Standard

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
\layout Standard

9
\layout Standard


\begin_inset LatexCommand \index

\end_inset 


\the_end
