]> git.gag.com Git - fw/sdcc/commitdiff
various additions and updates. Rearranged sections
authorfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 23 Aug 2003 20:10:48 +0000 (20:10 +0000)
committerfrief <frief@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 23 Aug 2003 20:10:48 +0000 (20:10 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2848 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
doc/sdccman.lyx

index e4a18c468b770901a2f23bf4b20f75562ee7ad1c..663cab9c7dc69bcc2300c7608e47ad0451085888 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2003-08-23  Frieder Ferlemann <Frieder.Ferlemann@web.de>
+
+       * doc/sdccman.lyx: various additions and updates. Rearranged sections
+
 2003-08-22  Jesus Calvino-Fraga <jesusc@ece.ubc.ca>
 
        Z80 and MCS51 linkers complaint if a public symbol is defined
        Rules 246.x, 247.x relate to bitfields, the others speed up
        access to xdata mapped I/O devices.
 
-       * src/mcs51/peeph.def: added 26 peepholes 246.x - 248.x, 180.x 
+       * src/mcs51/peeph.def: added 26 peepholes 246.x - 248.x, 180.x
 
 2003-08-16  Erik Petrich <epetrich@ivorytower.norman.ok.us>
 
index 2cbf8a9106058fb6acff255e39abf0a59cd22cab..fe3c79a4bb77f6dbbf1559e64751bbe527106f7b 100644 (file)
@@ -463,8 +463,12 @@ code banking
 \newline 
 
 \family default 
-If you can think of some more, please see the chapter 9 about filing feature
- requests
+If you can think of some more, please see the chapter 
+\begin_inset LatexCommand \ref{sub:Requesting-Features}
+
+\end_inset 
+
+ about filing feature requests
 \begin_inset LatexCommand \index{Requesting features}
 
 \end_inset 
@@ -479,7 +483,7 @@ If you can think of some more, please see the chapter 9 about filing feature
 
 \layout Section
 \pagebreak_top 
-Installation
+Installing SDCC
 \begin_inset LatexCommand \index{Installation}
 
 \end_inset 
@@ -4313,7 +4317,7 @@ Processor Selection Options
 
 
 \series default 
- Generate code for the MCS51
+ Generate code for the Intel MCS51
 \begin_inset LatexCommand \index{MCS51}
 
 \end_inset 
@@ -6748,6 +6752,121 @@ status Collapsed
 \size default 
 \bar default 
 Will cause all the above mentioned dumps to be created.
+\layout Subsubsection
+
+Redirecting output on Windows Shells
+\layout Standard
+
+By default SDCC writes it's error messages to 
+\begin_inset Quotes sld
+\end_inset 
+
+standard error
+\begin_inset Quotes srd
+\end_inset 
+
+.
+ To force all messages to 
+\begin_inset Quotes sld
+\end_inset 
+
+standard output
+\begin_inset Quotes srd
+\end_inset 
+
+ use 
+\series bold 
+-
+\series default 
+\emph on 
+
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+
+\series bold 
+\emph default 
+-
+\series default 
+use-stdout
+\begin_inset LatexCommand \index{-\/-use-stdout}
+
+\end_inset 
+
+.
+ Aditionaly, if you happen to have visual studio installed in your windows
+ machine, you can use it to compile your sources using a custom build and
+ the SDCC -
+\emph on 
+
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+
+\emph default 
+-vc
+\begin_inset LatexCommand \index{-\/-vc}
+
+\end_inset 
+
+ option.
+ Something like this should work:
+\newline 
+
+\newline 
+
+\series bold 
+c:
+\backslash 
+sdcc
+\backslash 
+bin
+\backslash 
+sdcc.exe -
+\series default 
+\emph on 
+
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+
+\series bold 
+\emph default 
+-vc -
+\series default 
+\emph on 
+
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+
+\series bold 
+\emph default 
+-model-large -c $(InputPath)
 \layout Subsection
 
 Environment variables
@@ -7245,14 +7364,14 @@ sbit at 0xd7 CY; /* CY (Carry Flag
 \end_inset 
 
 ) */
-\layout Subsection
+\layout Subsubsection
 
 Pointers
 \begin_inset LatexCommand \index{Pointers}
 
 \end_inset 
 
-
+ to MCS51/DS390 specific memory spaces
 \layout Standard
 
 SDCC allows (via language extensions) pointers to explicitly point to any
@@ -7336,274 +7455,539 @@ generic
  code.
 \layout Subsection
 
-Parameters
-\begin_inset LatexCommand \index{Parameters}
-
-\end_inset 
-
- & Local Variables
-\begin_inset LatexCommand \index{Local variable}
+Absolute Addressing
+\begin_inset LatexCommand \index{Absolute addressing}
 
 \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).
- This in fact makes them 
+Data items can be assigned an absolute address with the 
 \emph on 
-static
-\begin_inset LatexCommand \index{static}
+at
+\begin_inset LatexCommand \index{at}
 
 \end_inset 
 
-
+ <address>
 \emph default 
- so by default functions are non-reentrant
-\begin_inset LatexCommand \index{reentrant}
-
-\end_inset 
+ keyword, in addition to a storage class, e.g.:
+\layout Verse
 
-.
-\newline 
 
-\newline 
-They can be placed on the stack
-\begin_inset LatexCommand \index{stack}
+\family typewriter 
+xdata
+\begin_inset LatexCommand \index{xdata}
 
 \end_inset 
 
- either by using the
-\emph on 
- -
-\begin_inset ERT
-status Collapsed
+ at
+\begin_inset LatexCommand \index{at}
+
+\end_inset 
 
+ 0x7ffe unsigned int chksum;
 \layout Standard
 
-\backslash 
-/
+In the above example the variable chksum will located at 0x7ffe and 0x7fff
+ of the external ram.
+ 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
+\begin_inset LatexCommand \index{.lst}
+
 \end_inset 
 
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+) and the linker output files (.rst
+\begin_inset LatexCommand \index{.rst}
 
 \end_inset 
 
-
-\emph default 
- option or by using the 
-\emph on 
-reentrant
-\begin_inset LatexCommand \index{reentrant}
+) and (.map
+\begin_inset LatexCommand \index{.map}
 
 \end_inset 
 
+) are good places to look for such overlaps.
+\layout Standard
 
+In case of memory mapped I/O devices the keyword 
+\emph on 
+volatile
 \emph default 
- keyword in the function declaration, e.g.:
+ should be used to tell the compiler that accesses might not be optimized
+ away:
 \layout Verse
 
 
 \family typewriter 
-unsigned char foo(char i) reentrant 
-\newline 
-{ 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-...
-\newline 
-}
-\layout Standard
+volatile
+\begin_inset LatexCommand \index{volatile}
 
-Since stack space on 8051 is limited, the 
-\emph on 
-reentrant 
-\emph default 
-keyword or the
-\emph on 
- -
-\begin_inset ERT
-status Collapsed
+\end_inset 
 
-\layout Standard
+ xdata
+\begin_inset LatexCommand \index{xdata}
 
-\backslash 
-/
 \end_inset 
 
--stack-auto
-\emph default 
- option should be used sparingly.
- Note that the reentrant keyword just means that the parameters & local
- variables will be allocated to the stack, it 
-\emph on 
-does not
-\emph default 
- mean that the function is register bank independent.
-\newline 
-
-\newline 
-Local variables can be assigned storage classes and absolute
-\begin_inset LatexCommand \index{Absolute addressing}
+ at
+\begin_inset LatexCommand \index{at}
 
 \end_inset 
 
- addresses, e.g.: 
+ 0x8000 unsigned char PORTA_8255;
+\layout Standard
+
+Absolute address can be specified for variables in all storage classes,
+ e.g.:
 \layout Verse
 
 
 \family typewriter 
-unsigned char foo() 
-\newline 
-{
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+bit
+\begin_inset LatexCommand \index{bit}
+
+\end_inset 
+
+ at
+\begin_inset LatexCommand \index{at}
+
+\end_inset 
+
+ 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.
+ One possible use would be to write hardware portable code.
+ For example, if you have a routine that uses one or more of the microcontroller
+ I/O pins, and such pins are different for two different hardwares, you
+ can declare the I/O pins in your routine using:
+\layout Verse
+
+
+\family typewriter 
+extern bit SDI;
+\newline 
+extern bit SCLK;
+\newline 
+extern bit CPOL;
+\newline 
+
+\newline 
+void DS1306_put(unsigned char value)
+\newline 
+{
+\newline 
 \SpecialChar ~
-xdata unsigned char i;
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+unsigned char mask=0x80;
+\newline 
+
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-bit bvar;
+while(mask)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-data at 0x31 unsigned char j;
+{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-...
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDI=(value & mask)?1:0;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SCLK=!CPOL;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SCLK=CPOL;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mask/=2;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+}
 \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 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+Then, someplace in the code for the first hardware you would use
+\layout Verse
+
 
+\family typewriter 
+bit at 0x80 SDI;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* I/O port 0, bit 0 */
+\newline 
+bit at 0x81 SCLK;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* I/O port 0, bit 1 */
+\newline 
+bit CPOL;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* This is a variable, let the linker allocate this one */
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+Similarly, for the second hardware you would use
+\layout Verse
 
--stack-auto
-\emph default 
- or when a function is declared as 
-\emph on 
-reentrant
-\emph default 
- this should only be done for static variables.
+
+\family typewriter 
+bit at 0x83 SDI;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* I/O port 0, bit 3 */
+\newline 
+bit at 0x91 SCLK;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* I/O port 1, bit 1 */
+\newline 
+bit CPOL;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* This is a variable, let the linker allocate this one */
 \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.
+and you can use the same hardware dependent routine without changes, as
+ for example in a library.
+ This is somehow similar to sbit, but only one absolute address has to be
+ specified in the whole project.
 \layout Subsection
 
-Overlaying
-\begin_inset LatexCommand \label{sub:Overlaying}
+Parameters
+\begin_inset LatexCommand \index{Parameters}
 
 \end_inset 
 
-
-\begin_inset LatexCommand \index{Overlaying}
+ & Local Variables
+\begin_inset LatexCommand \index{Local variable}
 
 \end_inset 
 
 
 \layout Standard
 
-For non-reentrant
-\begin_inset LatexCommand \index{reentrant}
-
-\end_inset 
-
- functions SDCC will try to reduce internal ram space usage by overlaying
- parameters and local variables of a function (if possible).
- Parameters and local variables of a function will be allocated to an overlayabl
-e segment if the function has 
+Automatic (local) variables and parameters to functions can either be placed
+ on the stack or in data-space.
+ The default action of the compiler is to place these variables in the internal
+ RAM (for small model) or external RAM (for large model).
+ This in fact makes them 
 \emph on 
-no other function calls and the function is non-reentrant and the memory
- model
-\begin_inset LatexCommand \index{Memory model}
+static
+\begin_inset LatexCommand \index{static}
 
 \end_inset 
 
- is small.
 
 \emph default 
- If an explicit storage class
-\begin_inset LatexCommand \index{Storage class}
+ so by default functions are non-reentrant
+\begin_inset LatexCommand \index{reentrant}
 
 \end_inset 
 
- is specified for a local variable, it will NOT be overlayed.
-\layout Standard
+.
+\newline 
 
-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\SpecialChar ~
-NOOVERLAY
-\begin_inset LatexCommand \index{\#pragma NOOVERLAY}
+\newline 
+They can be placed on the stack
+\begin_inset LatexCommand \index{stack}
 
 \end_inset 
 
- if they are not reentrant.
+ either by using the
+\emph on 
+ -
+\begin_inset ERT
+status Collapsed
+
 \layout Standard
 
-Also note that the compiler does not do any processing of inline
-\begin_inset LatexCommand \index{inline}
+\backslash 
+/
+\end_inset 
+
+-stack-auto
+\begin_inset LatexCommand \index{-\/-stack-auto}
 
 \end_inset 
 
- assembler code, so the compiler might incorrectly assign local variables
- and parameters of a function into the overlay segment if the inline assembler
- code calls other c-functions that might use the overlay.
- In that case the #pragma\SpecialChar ~
-NOOVERLAY should be used.
-\layout Standard
 
-Parameters and Local variables of functions that contain 16 or 32 bit multiplica
-tion
-\begin_inset LatexCommand \index{Multiplication}
+\emph default 
+ option or by using the 
+\emph on 
+reentrant
+\begin_inset LatexCommand \index{reentrant}
 
 \end_inset 
 
- or division
-\begin_inset LatexCommand \index{Division}
+
+\emph default 
+ keyword in the function declaration, e.g.:
+\layout Verse
+
+
+\family typewriter 
+unsigned char foo(char i) reentrant 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+\newline 
+}
+\layout Standard
+
+Since stack space on 8051 is limited, the 
+\emph on 
+reentrant 
+\emph default 
+keyword or the
+\emph on 
+ -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-stack-auto
+\emph default 
+ option should be used sparingly.
+ Note that the reentrant keyword just means that the parameters & local
+ variables will be allocated to the stack, it 
+\emph on 
+does not
+\emph default 
+ mean that the function is register bank independent.
+\newline 
+
+\newline 
+Local variables can be assigned storage classes and absolute
+\begin_inset LatexCommand \index{Absolute addressing}
+
+\end_inset 
+
+ addresses, e.g.: 
+\layout Verse
+
+
+\family typewriter 
+unsigned char foo() 
+\newline 
+{
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+xdata unsigned char i;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+bit bvar;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+data at 0x31 unsigned char j;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+\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 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-stack-auto
+\emph default 
+ or when a function is declared as 
+\emph on 
+reentrant
+\emph default 
+ this should only be done for static variables.
+\layout Standard
+
+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{sub:Overlaying}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{Overlaying}
+
+\end_inset 
+
+
+\layout Standard
+
+For non-reentrant
+\begin_inset LatexCommand \index{reentrant}
+
+\end_inset 
+
+ functions SDCC will try to reduce internal ram space usage by overlaying
+ parameters and local variables of a function (if possible).
+ Parameters and local variables 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
+\begin_inset LatexCommand \index{Memory model}
+
+\end_inset 
+
+ is small.
+
+\emph default 
+ If an explicit storage class
+\begin_inset LatexCommand \index{Storage class}
+
+\end_inset 
+
+ is specified for a local variable, it will NOT be overlayed.
+\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\SpecialChar ~
+NOOVERLAY
+\begin_inset LatexCommand \index{\#pragma NOOVERLAY}
+
+\end_inset 
+
+ if they are not reentrant.
+\layout Standard
+
+Also note that the compiler does not do any processing of inline
+\begin_inset LatexCommand \index{inline}
+
+\end_inset 
+
+ assembler code, so the compiler might incorrectly assign local variables
+ and parameters of a function into the overlay segment if the inline assembler
+ code calls other c-functions that might use the overlay.
+ In that case the #pragma\SpecialChar ~
+NOOVERLAY should be used.
+\layout Standard
+
+Parameters and Local variables of functions that contain 16 or 32 bit multiplica
+tion
+\begin_inset LatexCommand \index{Multiplication}
+
+\end_inset 
+
+ or division
+\begin_inset LatexCommand \index{Division}
 
 \end_inset 
 
@@ -8546,175 +8930,210 @@ It is most efficient if your ISR calls no other functions.
  
 \layout Subsection
 
-Absolute Addressing
-\begin_inset LatexCommand \index{Absolute addressing}
+Startup Code
+\begin_inset LatexCommand \index{Startup code}
 
 \end_inset 
 
 
 \layout Standard
 
-Data items can be assigned an absolute address with th
+The compiler inserts a call to the C routin
 \emph on 
-at
-\begin_inset LatexCommand \index{at}
+_sdcc_external_startup()
+\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
 
 \end_inset 
 
- <address>
-\emph default 
- keyword, in addition to a storage class, e.g.:
-\layout Verse
-
 
-\family typewriter 
-xdata
-\begin_inset LatexCommand \index{xdata}
+\series bold 
+\emph default 
+\series default 
+at the start of the CODE area.
+ This routine is in the runtime library
+\begin_inset LatexCommand \index{Runtime library}
 
 \end_inset 
 
- at
-\begin_inset LatexCommand \index{at}
-
-\end_inset 
+.
+ By default this routine returns 0, if this routine returns a non-zero value,
+ the static & global variable initialization will be skipped and the function
+ main will be invoked.
+ Otherwise static & global variables will be initialized before the function
+ main is invoked.
+ You could add a 
+\emph on 
+_sdcc_external_startup()
+\emph default 
+ routine to your program to override the default if you need to setup hardware
+ or perform some other critical operation prior to static & global variable
+ initialization.
+ See also the compiler option 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
- 0x7ffe unsigned int chksum;
 \layout Standard
 
-In the above example the variable chksum will located at 0x7ffe and 0x7fff
- of the external ram.
- 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
-\begin_inset LatexCommand \index{.lst}
-
+\backslash 
+/
 \end_inset 
 
-) and the linker output files (.rst
-\begin_inset LatexCommand \index{.rst}
+-no-xinit
+\emph default 
+-
+\emph on 
+opt
+\emph default 
+
+\begin_inset LatexCommand \index{-\/-no-xinit-opt}
 
 \end_inset 
 
-) and (.map
-\begin_inset LatexCommand \index{.map}
+.
+\layout Subsection
+
+Inline Assembler Code
+\begin_inset LatexCommand \index{Assembler routines}
 
 \end_inset 
 
-) are good places to look for such overlaps.
+
 \layout Standard
 
-In case of memory mapped I/O devices the keyword 
+SDCC allows the use of in-line assembler with a few restriction as regards
+ labels.
+ All labels defined within inline assembler code 
 \emph on 
-volatile
+has to be
 \emph default 
- should be used to tell the compiler that accesses might not be optimized
- away:
-\layout Verse
-
+ of the form 
+\emph on 
+nnnnn$
+\emph default 
+ where nnnn is a number less than 100 (which implies a limit of utmost 100
+ inline assembler labels 
+\emph on 
+per function
+\emph default 
+\noun on 
+)
+\noun default 
+.
+ It is strongly recommended that each assembly instruction (including labels)
+ be placed in a separate line (as the example shows).
+ When the -
+\begin_inset ERT
+status Collapsed
 
-\family typewriter 
-volatile
-\begin_inset LatexCommand \index{volatile}
+\layout Standard
 
+\backslash 
+/
 \end_inset 
 
- xdata
-\begin_inset LatexCommand \index{xdata}
+-
+\emph on 
+peep-asm
+\begin_inset LatexCommand \index{-\/-peep-asm}
 
 \end_inset 
 
- at
-\begin_inset LatexCommand \index{at}
 
-\end_inset 
+\emph default 
+ command line option is used, the inline assembler code will be passed through
+ the peephole optimizer
+\begin_inset LatexCommand \index{Peephole optimizer}
 
- 0x8000 unsigned char PORTA_8255;
-\layout Standard
+\end_inset 
 
-Absolute address can be specified for variables in all storage classes,
- e.g.:
+.
+ This might cause some unexpected changes in the inline assembler code.
+ Please go through the peephole optimizer rules defined in file 
+\emph on 
+SDCCpeeph.def
+\emph default 
+ carefully before using this option.
 \layout Verse
 
 
 \family typewriter 
-bit
-\begin_inset LatexCommand \index{bit}
-
-\end_inset 
-
- at
-\begin_inset LatexCommand \index{at}
+_asm
+\begin_inset LatexCommand \index{\_asm}
 
 \end_inset 
 
- 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.
- One possible use would be to write hardware portable code.
- For example, if you have a routine that uses one or more of the microcontroller
- I/O pins, and such pins are different for two different hardwares, you
- can declare the I/O pins in your routine using:
-\layout Verse
-
-
-\family typewriter 
-extern bit SDI;
-\newline 
-extern bit SCLK;
-\newline 
-extern bit CPOL;
-\newline 
-
-\newline 
-void DS1306_put(unsigned char value)
-\newline 
-{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-unsigned char mask=0x80;
-\newline 
-
-\newline 
+mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-while(mask)
+b,#10 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-{
+00001$: 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+djnz\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-SDI=(value & mask)?1:0;
+b,00001$ 
+\newline 
+_endasm
+\begin_inset LatexCommand \index{\_endasm}
+
+\end_inset 
+
+ ;
+\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 
+\family typewriter 
+_asm ...
+ _endasm;
+\family default 
+ keyword pair.
+\newline 
+
+\newline 
+Inline assembler code cannot reference any C-Labels, however it can reference
+ labels
+\begin_inset LatexCommand \index{Labels}
+
+\end_inset 
+
+ defined by the inline assembler, e.g.:
+\layout Verse
+
+
+\family typewriter 
+foo() { 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+/* some c code */ 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-SCLK=!CPOL;
+_asm 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -8722,9 +9141,7 @@ SCLK=!CPOL;
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SCLK=CPOL;
+; some assembler code 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -8732,180 +9149,107 @@ SCLK=CPOL;
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mask/=2;
+ljmp $0003 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-}
+_endasm; 
 \newline 
-}
-\layout Standard
-
-Then, someplace in the code for the first hardware you would use
-\layout Verse
-
-
-\family typewriter 
-bit at 0x80 SDI;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* I/O port 0, bit 0 */
-\newline 
-bit at 0x81 SCLK;\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
-/* I/O port 0, bit 1 */
+/* some more c code */ 
 \newline 
-bit CPOL;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+clabel:\SpecialChar ~
 \SpecialChar ~
+/* inline assembler cannot reference this label */ 
+\newline 
 \SpecialChar ~
-/* This is a variable, let the linker allocate this one */
-\layout Standard
-
-Similarly, for the second hardware you would use
-\layout Verse
-
-
-\family typewriter 
-bit at 0x83 SDI;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* I/O port 0, bit 3 */
+_asm
 \newline 
-bit at 0x91 SCLK;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* I/O port 1, bit 1 */
-\newline 
-bit CPOL;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+$0003: ;label (can be reference by inline assembler only) 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+_endasm ; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* This is a variable, let the linker allocate this one */
+/* some more c code */
+\newline 
+}
 \layout Standard
 
-and you can use the same hardware dependent routine without changes, as
for example in a library.
- This is somehow similar to sbit, but only one absolute address has to be
specified in the whole project.
-\layout Subsection
+In other words inline assembly code can access labels defined in inline
assembly within the scope of the function.
+ The same goes the other way, ie.
labels defines in inline assembly CANNOT be accessed by C statements.
+\layout Standard
 
-Startup Code
-\begin_inset LatexCommand \index{Startup code}
+An example acessing a C variable is in section 
+\begin_inset LatexCommand \ref{sub:Naked-Functions}
 
 \end_inset 
 
+.
+\layout Subsection
 
-\layout Standard
-
-The compiler inserts a call to the C routine 
-\emph on 
-_sdcc_external_startup()
-\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
+Interfacing with Assembler Code
+\begin_inset LatexCommand \index{Assembler routines}
 
 \end_inset 
 
 
-\series bold 
-\emph default 
-\series default 
-at the start of the CODE area.
- This routine is in the runtime library
-\begin_inset LatexCommand \index{Runtime library}
+\layout Subsubsection
+
+Global Registers used for Parameter Passing
+\begin_inset LatexCommand \index{Parameter passing}
 
 \end_inset 
 
-.
- By default this routine returns 0, if this routine returns a non-zero value,
- the static & global variable initialization will be skipped and the function
- main will be invoked.
- Otherwise static & global variables will be initialized before the function
- main is invoked.
- You could add a 
-\emph on 
-_sdcc_external_startup()
-\emph default 
- routine to your program to override the default if you need to setup hardware
- or perform some other critical operation prior to static & global variable
- initialization.
- See also the compiler option 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--no-xinit
-\emph default 
--
+The compiler always uses the global registers 
 \emph on 
-opt
-\emph default 
-
-\begin_inset LatexCommand \index{-\/-no-xinit-opt}
+DPL, DPH
+\begin_inset LatexCommand \index{DPTR, DPH, DPL}
 
 \end_inset 
 
-.
-\layout Subsection
-
-Inline Assembler Code
-\begin_inset LatexCommand \index{Assembler routines}
+, B
+\begin_inset LatexCommand \index{B (register)}
 
 \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 
-\emph on 
-has to be
-\emph default 
- of the form 
-\emph on 
-nnnnn$
 \emph default 
- where nnnn is a number less than 100 (which implies a limit of utmost 100
- inline assembler labels 
+and
 \emph on 
-per function
+ ACC
+\begin_inset LatexCommand \index{ACC}
+
+\end_inset 
+
+
 \emph default 
-\noun on 
-)
-\noun default 
-.
- It is strongly recommended that each assembly instruction (including labels)
- be placed in a separate line (as the example shows).
- When the -
+ to pass the first parameter to a routine.
+ The second parameter onwards is either allocated on the stack (for reentrant
+ routines or if -
 \begin_inset ERT
 status Collapsed
 
@@ -8915,106 +9259,77 @@ status Collapsed
 /
 \end_inset 
 
--
-\emph on 
-peep-asm
-\begin_inset LatexCommand \index{-\/-peep-asm}
+-stack-auto is used) or in data / xdata memory (depending on the memory
+ model).
+\layout Subsubsection
 
-\end_inset 
+Assembler Routine(non-reentrant
+\begin_inset LatexCommand \index{reentrant}
 
+\end_inset 
 
-\emph default 
- command line option is used, the inline assembler code will be passed through
- the peephole optimizer
-\begin_inset LatexCommand \index{Peephole optimizer}
+)
+\begin_inset LatexCommand \index{Assembler routines (non-reentrant)}
 
 \end_inset 
 
-.
- This might cause some unexpected changes in the inline assembler code.
- Please go through the peephole optimizer rules defined in file 
-\emph on 
-SDCCpeeph.def
-\emph default 
- carefully before using this option.
+
+\layout Standard
+
+In the following example the function c_func calls an assembler routine
+ asm_func, which takes two parameters.
 \layout Verse
 
 
 \family typewriter 
-_asm
-\begin_inset LatexCommand \index{\_asm}
-
-\end_inset 
+extern int asm_func(unsigned char, unsigned char);
+\newline 
 
+\newline 
+int c_func (unsigned char i, unsigned char j)
+\newline 
+{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-b,#10 
+return asm_func(i,j);
 \newline 
-00001$: 
+}
+\newline 
+
+\newline 
+int main()
+\newline 
+{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-djnz\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-b,00001$ 
+return c_func(10,9);
 \newline 
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
-
-\end_inset 
-
- ;
+}
 \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 
-\family typewriter 
-_asm ...
- _endasm;
-\family default 
- keyword pair.
-\newline 
-
-\newline 
-Inline assembler code cannot reference any C-Labels, however it can reference
- labels
-\begin_inset LatexCommand \index{Labels}
-
-\end_inset 
-
- defined by the inline assembler, e.g.:
+The corresponding assembler function is:
 \layout Verse
 
 
 \family typewriter 
-foo() { 
+.globl _asm_func_PARM_2 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* some c code */ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm 
+.globl _asm_func 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -9022,7 +9337,11 @@ _asm
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; some assembler code 
+\SpecialChar ~
+\SpecialChar ~
+.area OSEG 
+\newline 
+_asm_func_PARM_2:
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -9030,63 +9349,314 @@ _asm
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ljmp $0003 
+\SpecialChar ~
+\SpecialChar ~
+.ds     1 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* some more c code */ 
+.area CSEG 
 \newline 
-clabel:\SpecialChar ~
-\SpecialChar ~
-/* inline assembler cannot reference this label */ 
+_asm_func: 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov    a,dpl 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-$0003: ;label (can be reference by inline assembler only) 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add    a,_asm_func_PARM_2 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm ; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov    dpl,a 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* some more c code */
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dpl
+\begin_inset LatexCommand \index{DPTR, DPH, DPL}
+
+\end_inset 
+
+,#0x00 
 \newline 
-}
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ret
 \layout Standard
 
-In other words inline assembly code can access labels defined in inline
assembly within the scope of the function.
- The same goes the other way, ie.
- labels defines in inline assembly CANNOT be accessed by C statements.
+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
 
-An example acessing a C variable is in section 
-\begin_inset LatexCommand \ref{sub:Naked-Functions}
+The parameter naming convention is _<function_name>_PARM_<n>, where n is
+ the parameter number starting from 1, and counting from the left.
+ The first parameter is passed in 
+\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 variable name for the second parameter will be _<function_n
+ame>_PARM_2.
+\newline 
+
+\newline 
+Assemble the assembler routine with the following command:
+\newline 
+
+\newline 
+
+\family sans 
+\series bold 
+asx8051 -losg asmfunc.asm
+\newline 
+
+\newline 
+
+\family default 
+\series default 
+Then compile and link the assembler routine to the C source file with the
+ following command:
+\newline 
+
+\newline 
+
+\family sans 
+\series bold 
+sdcc cfunc.c asmfunc.rel
+\layout Subsubsection
+
+Assembler Routine(reentrant
+\begin_inset LatexCommand \index{reentrant}
+
+\end_inset 
+
+)
+\begin_inset LatexCommand \index{Assembler routines (reentrant)}
+
+\end_inset 
+
+
+\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 Verse
+
+
+\family typewriter 
+extern int asm_func(unsigned char, unsigned char);
+\newline 
+
+\newline 
+int c_func (unsigned char i, unsigned char j) reentrant 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return asm_func(i,j); 
+\newline 
+} 
+\newline 
+
+\newline 
+int main() 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c_func(10,9); 
+\newline 
+}
+\layout Standard
+
+The corresponding assembler routine is:
+\layout Verse
+
+
+\family typewriter 
+.globl _asm_func 
+\newline 
+_asm_func: 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push  _bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov _bp,sp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  r2,dpl
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  a,_bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+clr  c 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add  a,#0xfd 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  r0,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add  a,#0xfc
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  r1,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  a,@r0 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add  a,r2
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  dpl,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  dph,#0x00 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  sp,_bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop  _bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ret
+\layout Standard
+
+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
 
 int (16 bit)
@@ -10190,38 +10760,284 @@ status Collapsed
  However, currently the linker can not handle code segments > 64k.
 \layout Subsection
 
-Defines Created by the Compiler
-\begin_inset LatexCommand \index{Defines created by the compiler}
+Pragmas
+\begin_inset LatexCommand \index{Pragmas}
 
 \end_inset 
 
 
 \layout Standard
 
-The compiler creates the following #defines
-\begin_inset LatexCommand \index{\#defines}
+SDCC supports the following #pragma directives.
+\layout Itemize
+
+SAVE
+\begin_inset LatexCommand \index{\#pragma SAVE}
 
 \end_inset 
 
-:
-\newline 
+ - this will save all current options to the SAVE/RESTORE stack.
+ See RESTORE.
+\layout Itemize
 
-\layout Standard
+RESTORE
+\begin_inset LatexCommand \index{\#pragma RESTORE}
 
+\end_inset 
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="10" columns="2">
-<features>
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+ - will restore saved options from the last save.
+ SAVEs & RESTOREs can be nested.
+ SDCC uses a SAVE/RESTORE stack: SAVE pushes current options to the stack,
+ RESTORE pulls current options from the stack.
+ See SAVE.
+\layout Itemize
 
-\layout Standard
+NOGCSE
+\begin_inset LatexCommand \index{\#pragma NOGCSE}
 
+\end_inset 
 
-\series bold 
+ - will stop global common subexpression elimination.
+\layout Itemize
+
+NOINDUCTION
+\begin_inset LatexCommand \index{\#pragma NOINDUCTION}
+
+\end_inset 
+
+ - will stop loop induction optimizations.
+\layout Itemize
+
+NOJTBOUND
+\begin_inset LatexCommand \index{\#pragma NOJTBOUND}
+
+\end_inset 
+
+ - will not generate code for boundary value checking, when switch statements
+ are turned into jump-tables (dangerous).
+\layout Itemize
+
+NOOVERLAY
+\begin_inset LatexCommand \index{\#pragma NOOVERLAY}
+
+\end_inset 
+
+ - the compiler will not overlay the parameters and local variables of a
+ function.
+\layout Itemize
+
+LESS_PEDANTIC
+\begin_inset LatexCommand \index{\#pragma LESS\_PEDANTIC}
+
+\end_inset 
+
+ - the compiler will not warn you anymore for obvious mistakes, you'r on
+ your own now ;-(
+\layout Itemize
+
+NOLOOPREVERSE
+\begin_inset LatexCommand \index{\#pragma NOLOOPREVERSE}
+
+\end_inset 
+
+ - Will not do loop reversal optimization
+\layout Itemize
+
+EXCLUDE
+\begin_inset LatexCommand \index{\#pragma EXCLUDE}
+
+\end_inset 
+
+ NONE | {acc[,b[,dpl[,dph]]] - The exclude pragma disables generation of
+ pair of push/pop
+\begin_inset LatexCommand \index{push/pop}
+
+\end_inset 
+
+ instruction in ISR function (using interrupt
+\begin_inset LatexCommand \index{interrupt}
+
+\end_inset 
+
+ 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 #pragma\SpecialChar ~
+EXCLUDE\SpecialChar ~
+none
+\begin_inset LatexCommand \index{\#pragma EXCLUDE}
+
+\end_inset 
+
+.
+\layout Itemize
+
+NOIV
+\begin_inset LatexCommand \index{\#pragma NOIV}
+
+\end_inset 
+
+ - Do not generate interrupt vector table entries for all ISR functions
+ defined after the pragma.
+ This is useful in cases where the interrupt vector table must be defined
+ manually, or when there is a secondary, manually defined interrupt vector
+ table (e.g.
+ for the autovector feature of the Cypress EZ-USB FX2).
+\layout Itemize
+
+CALLEE-SAVES
+\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{function prologue}
+
+\end_inset 
+
+ function1[,function2[,function3...]] - The compiler by default uses a caller
+ saves convention for register saving across function calls, however this
+ can cause unnecessary register pushing & popping when calling small functions
+ from larger functions.
+ This option can be used to switch off the register saving convention for
+ the function names specified.
+ The compiler will not save registers when calling these functions, extra
+ code need to be manually inserted at the entry & exit for these functions
+ to save & restore the registers used by these functions, this can SUBSTANTIALLY
+ reduce code & improve run time performance of the generated code.
+ In the future the compiler (with inter procedural analysis) may be able
+ to determine the appropriate scheme to use for each function call.
+ If -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-callee-saves command line option is used, the function names specified
+ in #pragma\SpecialChar ~
+CALLEE-SAVES
+\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES}
+
+\end_inset 
+
+ is appended to the list of functions specified in the 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 before and/or after a function, placing pragma's inside
+ a function body could have unpredictable results.
+\layout Verse
+
+
+\family typewriter 
+#pragma SAVE
+\begin_inset LatexCommand \index{\#pragma SAVE}
+
+\end_inset 
+
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* save the current settings */ 
+\newline 
+#pragma NOGCSE
+\begin_inset LatexCommand \index{\#pragma NOGCSE}
+
+\end_inset 
+
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* turnoff global subexpression elimination */ 
+\newline 
+#pragma NOINDUCTION
+\begin_inset LatexCommand \index{\#pragma NOINDUCTION}
+
+\end_inset 
+
+ /* turn off induction optimizations */ 
+\newline 
+int foo () 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ /* large code */ 
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+\newline 
+} 
+\newline 
+#pragma RESTORE
+\begin_inset LatexCommand \index{\#pragma RESTORE}
+
+\end_inset 
+
+ /* turn the optimizations back on */
+\layout Standard
+
+The compiler will generate a warning message when extra space is allocated.
+ It is strongly recommended that the SAVE and RESTORE pragma's be used when
+ changing options for a function.
+\layout Subsection
+
+Defines Created by the Compiler
+\begin_inset LatexCommand \index{Defines created by the compiler}
+
+\end_inset 
+
+
+\layout Standard
+
+The compiler creates the following #defines
+\begin_inset LatexCommand \index{\#defines}
+
+\end_inset 
+
+:
+\newline 
+
+\layout Standard
+
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="10" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
 #define
 \end_inset 
 </cell>
@@ -10535,34 +11351,53 @@ when
 
 \newline 
 
-\layout Subsection
+\layout Section
+\pagebreak_top 
+Debugging with SDCDB
+\begin_inset LatexCommand \index{sdcdb}
 
-Redirecting output on Windows Shells
+\end_inset 
+
 \layout Standard
 
-By default SDCC writes it's error messages to 
-\begin_inset Quotes sld
-\end_inset 
+SDCC is distributed with a source level debugger
+\begin_inset LatexCommand \index{Debugger}
 
-standard error
-\begin_inset Quotes srd
 \end_inset 
 
 .
- To force all messages to 
-\begin_inset Quotes sld
-\end_inset 
+ The debugger uses a command line interface, the command repertoire of the
+ debugger has been kept as close to gdb
+\begin_inset LatexCommand \index{gdb}
 
-standard output
-\begin_inset Quotes srd
 \end_inset 
 
- use 
-\series bold 
--
-\series default 
-\emph on 
+ (the GNU debugger) as possible.
+ The configuration and build process is part of the standard compiler installati
+on, which also builds and installs the debugger in the target directory
+ specified during configuration.
+ The debugger allows you debug BOTH at the C source and at the ASM source
+ level.
+ Sdcdb is available on Unix platforms only.
+\layout Subsection
+
+Compiling for Debugging
+\layout Standard
+
+The \SpecialChar \-
+\SpecialChar \-
+debug option must be specified for all files for which debug information
+ is to be generated.
+ The complier generates a .adb file for each of these files.
+ The linker creates the .cdb file from the .adb files and the address information.
+ This .cdb is used by the debugger.
+\layout Subsection
 
+How the Debugger Works
+\layout Standard
+
+When the -
 \begin_inset ERT
 status Collapsed
 
@@ -10572,55 +11407,74 @@ status Collapsed
 /
 \end_inset 
 
+-debug 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 .adb file.
+  Then the linker creates the .cdb file from the individual .adb files with
+ the address information for the symbols.
+ The debugger reads the symbolic information generated by the compiler &
+ the address information generated by the linker.
+ It uses the SIMULATOR (Daniel's S51) to execute the program, the program
+ execution is controlled by the debugger.
+ When a command is issued for the debugger, it translates it into appropriate
+ commands for the simulator.
+\layout Subsection
+
+Starting the Debugger
+\layout Standard
+
+The debugger can be started using the following command line.
+ (Assume the file you are debugging has the file name foo).
+\newline 
+
+\newline 
 
+\family sans 
 \series bold 
-\emph default 
--
+sdcdb foo
+\newline 
+
+\family default 
 \series default 
-use-stdout
-\begin_inset LatexCommand \index{-\/-use-stdout}
 
-\end_inset 
+\newline 
+The debugger will look for the following files.
+\layout Itemize
 
-.
- Aditionaly, if you happen to have visual studio installed in your windows
- machine, you can use it to compile your sources using a custom build and
- the SDCC -
-\emph on 
+foo.c - the source file.
+\layout Itemize
 
-\begin_inset ERT
-status Collapsed
+foo.cdb - the debugger symbol information file.
+\layout Itemize
 
-\layout Standard
+foo.ihx - the Intel hex format
+\begin_inset LatexCommand \index{Intel hex format}
 
-\backslash 
-/
 \end_inset 
 
+ object file.
+\layout Subsection
 
-\emph default 
--vc
-\begin_inset LatexCommand \index{-\/-vc}
-
-\end_inset 
+Command Line Options.
+\layout Itemize
 
- option.
- Something like this should work:
-\newline 
+-
+\begin_inset ERT
+status Collapsed
 
-\newline 
+\layout Standard
 
-\series bold 
-c:
-\backslash 
-sdcc
-\backslash 
-bin
 \backslash 
-sdcc.exe -
-\series default 
-\emph on 
+/
+\end_inset 
 
+-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 -
 \begin_inset ERT
 status Collapsed
 
@@ -10630,13 +11484,7 @@ status Collapsed
 /
 \end_inset 
 
-
-\series bold 
-\emph default 
--vc -
-\series default 
-\emph on 
-
+-directory option should be -
 \begin_inset ERT
 status Collapsed
 
@@ -10646,487 +11494,280 @@ status Collapsed
 /
 \end_inset 
 
+-directory=/home/src1:/home/src2.
+ Note there can be no spaces in the option.
+\layout Itemize
 
-\series bold 
-\emph default 
--model-large -c $(InputPath)
-\layout Section
-\pagebreak_top 
-SDCC Technical Data
-\layout Subsection
-
-Optimizations
-\begin_inset LatexCommand \index{Optimizations}
+-cd <directory> - change to the <directory>.
+\layout Itemize
 
-\end_inset 
+-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
 
-\layout Standard
+-X <Clock frequency > this options is passed to the simulator please see
+ the simulator docs for details.
+\layout Itemize
 
-SDCC performs a host of standard optimizations in addition to some MCU specific
- optimizations.
-\layout Subsubsection
+-s <serial port file> passed to simulator see the simulator docs for details.
+\layout Itemize
 
-Sub-expression Elimination
-\begin_inset LatexCommand \index{Subexpression elimination}
+-S <serial in,out> passed to simulator see the simulator docs for details.
+\layout Subsection
 
-\end_inset 
+Debugger Commands.
+\layout Standard
 
+As mentioned earlier the command interface for the debugger has been deliberatel
+y kept as close the GNU debugger gdb, as possible.
+ This will help the integration with existing graphical user interfaces
+ (like ddd, xxgdb or xemacs) existing for the GNU debugger.
+ If you use a graphical user interface for the debugger you can skip the
+ next sections.
+\layout Subsubsection*
 
+break [line | file:line | function | file:function]
 \layout Standard
 
-The compiler does local and global common subexpression elimination, e.g.:
-\layout Verse
+Set breakpoint at specified line or function:
+\newline 
 
+\newline 
 
-\family typewriter 
-i = x + y + 1; 
+\family sans 
+\series bold 
+sdcdb>break 100 
 \newline 
-j = x + y;
+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
 
-will be translated to
-\layout Verse
+Clear breakpoint at specified line or function:
+\newline 
 
+\newline 
 
-\family typewriter 
-iTemp = x + y; 
+\family sans 
+\series bold 
+sdcdb>clear 100
 \newline 
-i = iTemp + 1; 
+sdcdb>clear foo.c:100
 \newline 
-j = iTemp;
+sdcdb>clear funcfoo
+\newline 
+sdcdb>clear foo.c:funcfoo
+\layout Subsubsection*
+
+continue
 \layout Standard
 
-Some subexpressions are not as obvious as the above example, e.g.:
-\layout Verse
+Continue program being debugged, after breakpoint.
+\layout Subsubsection*
 
+finish
+\layout Standard
 
-\family typewriter 
-a->b[i].c = 10; 
-\newline 
-a->b[i].d = 11;
+Execute till the end of the current function.
+\layout Subsubsection*
+
+delete [n]
 \layout Standard
 
-In this case the address arithmetic a->b[i] will be computed only once;
the equivalent code in C would be.
-\layout Verse
+Delete breakpoint number 'n'.
If used without any option clear ALL user defined break points.
+\layout Subsubsection*
 
+info [break | stack | frame | registers ]
+\layout Itemize
 
-\family typewriter 
-iTemp = a->b[i]; 
-\newline 
-iTemp.c = 10; 
-\newline 
-iTemp.d = 11;
-\layout Standard
+info break - list all breakpoints
+\layout Itemize
 
-The compiler will try to keep these temporary variables in registers.
-\layout Subsubsection
+info stack - show the function call stack.
+\layout Itemize
 
-Dead-Code Elimination
-\begin_inset LatexCommand \index{Dead-code elimination}
+info frame - show information about the current execution frame.
+\layout Itemize
 
-\end_inset 
+info registers - show content of all registers.
+\layout Subsubsection*
 
+step
+\layout Standard
 
-\layout Verse
+Step program until it reaches a different source line.
+\layout Subsubsection*
 
+next
+\layout Standard
 
-\family typewriter 
-int global;
-\newline 
+Step program, proceeding through subroutine calls.
+\layout Subsubsection*
 
-\newline 
-void f () { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-int i; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-i = 1; \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* dead store */ 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-global = 1;\SpecialChar ~
-/* dead store */ 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-global = 2; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-return; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-global = 3;\SpecialChar ~
-/* unreachable */ 
-\newline 
-}
+run
 \layout Standard
 
-will be changed to
-\layout Verse
-
-
-\family typewriter 
-int global;
-\newline 
+Start debugged program.
+\layout Subsubsection*
 
-\newline 
-void f () {
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-global = 2; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-return; 
-\newline 
-}
-\layout Subsubsection
+ptype variable 
+\layout Standard
 
-Copy-Propagation
-\begin_inset LatexCommand \index{Copy propagation}
+Print type information of the variable.
+\layout Subsubsection*
 
-\end_inset 
+print variable
+\layout Standard
 
+print value of variable.
+\layout Subsubsection*
 
-\layout Verse
+file filename
+\layout Standard
 
+load the given file name.
+ Note this is an alternate method of loading file for debugging.
+\layout Subsubsection*
 
-\family typewriter 
-int f() { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-int i, j; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-i = 10; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-j = i; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-return j; 
-\newline 
-}
+frame
 \layout Standard
 
-will be changed to 
-\layout Verse
-
+print information about current frame.
+\layout Subsubsection*
 
-\family typewriter 
-int f() { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-int i, j; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-i = 10; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-j = 10; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-return 10; 
-\newline 
-}
+set srcmode
 \layout Standard
 
-Note: the dead stores created by this copy propagation will be eliminated
- by dead-code elimination.
-\layout Subsubsection
-
-Loop Optimizations
-\begin_inset LatexCommand \index{Loop optimization}
+Toggle between C source & assembly source.
+\layout Subsubsection*
 
-\end_inset 
+! 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
 
-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
-\begin_inset LatexCommand \index{Register allocation}
-
-\end_inset 
+"Watch me now.
+ Iam going Down.
+ My name is Bobby Brown"
+\layout Subsection
 
-, loop induction optimization causes an increase in register pressure, which
- may cause unwanted spilling of other temporary variables into the stack
-\begin_inset LatexCommand \index{stack}
+Interfacing with XEmacs
+\begin_inset LatexCommand \index{XEmacs}
 
 \end_inset 
 
- / 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 -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
 
--noinduction option) or for a given function only using #pragma\SpecialChar ~
-NOINDUCTION
-\begin_inset LatexCommand \index{\#pragma NOINDUCTION}
+\begin_inset LatexCommand \index{Emacs}
 
 \end_inset 
 
 .
-\newline 
+\layout Standard
 
+Two files (in emacs lisp) are provided for the interfacing with XEmacs,
+ sdcdb.el and sdcdbsrc.el.
+ These two files can be found in the $(prefix)/bin directory after the installat
+ion is complete.
+ These files need to be loaded into XEmacs for the interface to work.
+ This can be done at XEmacs startup time by inserting the following into
+ your '.xemacs' file (which can be found in your HOME directory): 
 \newline 
-Loop Invariant:
-\layout Verse
-
 
-\family typewriter 
-for (i = 0 ; i < 100 ; i ++) 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-f += k + l;
-\layout Standard
 
-changed to
-\layout Verse
+\family typewriter 
+(load-file sdcdbsrc.el) 
+\family default 
 
+\newline 
 
-\family typewriter 
-itemp = k + l; 
 \newline 
-for (i = 0; i < 100; i++) 
+.xemacs is a lisp file so the () around the command is REQUIRED.
+ The files can also be loaded dynamically while XEmacs is running, set the
+ environment variable 'EMACSLOADPATH' to the installation bin directory
+ (<installdir>/bin), then enter the following command ESC-x load-file sdcdbsrc.
+ To start the interface enter the following command: 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-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.
 \newline 
 
+\family sans 
+\series bold 
+ESC-x sdcdbsrc
+\family default 
+\series default 
+
 \newline 
-Strength Reduction
-\begin_inset LatexCommand \index{Strength reduction}
 
-\end_inset 
+\newline 
+You will prompted to enter the file name to be debugged.
+\newline 
 
-, this optimization substitutes an expression by a cheaper expression:
-\layout Verse
+\newline 
+The command line options that are passed to the simulator directly are bound
+ to default values in the file sdcdbsrc.el.
+ The variables are listed below, these values maybe changed as required.
+\layout Itemize
 
+sdcdbsrc-cpu-type '51
+\layout Itemize
 
-\family typewriter 
-for (i=0;i < 100; i++)
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-ar[i*5] = i*3;
+sdcdbsrc-frequency '11059200
+\layout Itemize
+
+sdcdbsrc-serial nil
 \layout Standard
 
-changed to
-\layout Verse
+The following is a list of key mapping for the debugger interface.
+\layout Standard
 
+\SpecialChar ~
 
 \family typewriter 
-itemp1 = 0; 
-\newline 
-itemp2 = 0; 
+
 \newline 
-for (i=0;i< 100;i++) { 
+;; Current Listing :: 
 \newline 
+;;key\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ar[itemp1] = itemp2; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-itemp1 += 5; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-itemp2 += 3; 
-\newline 
-}
-\layout Standard
-
-The more expensive multiplication
-\begin_inset LatexCommand \index{Multiplication}
-
-\end_inset 
-
- is changed to a less expensive addition.
-\layout Subsubsection
-
-Loop Reversing
-\begin_inset LatexCommand \index{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 compilers 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 
-
-\newline 
-
-\family typewriter 
-for(<symbol> = <expression>; <sym> [< | <=] <expression>; [<sym>++ | <sym>
- += 1])
-\newline 
 \SpecialChar ~
 \SpecialChar ~
+binding\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-<for body>
-\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 Subsubsection
-
-Algebraic Simplifications
-\layout Standard
-
-SDCC does numerous algebraic simplifications, the following is a small sub-set
- of these optimizations.
-\layout Verse
-
-
-\family typewriter 
-i = j + 0 ; /* changed to */ i = j; 
-\newline 
-i /= 2;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- /* 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
-\begin_inset LatexCommand \index{Subexpression}
-
-\end_inset 
-
- given above are generally introduced by macro expansions or as a result
- of copy/constant propagation.
-\layout Subsubsection
-
-'switch' Statements
-\begin_inset LatexCommand \index{switch statement}
-
-\end_inset 
-
-
-\layout Standard
-
-SDCC changes switch statements to jump tables
-\begin_inset LatexCommand \index{jump tables}
-
-\end_inset 
-
- 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.
-\begin_deeper 
-\layout Verse
-
-
-\family typewriter 
-switch(i) {\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11143,6 +11784,9 @@ switch(i) {\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+Comment 
+\newline 
+;;---\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11152,14 +11796,12 @@ switch(i) {\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-switch (i) { 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 4: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+------\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11181,15 +11823,16 @@ case 4: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+--------
+\newline 
+;; 
+\newline 
+;; n\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 0: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11198,6 +11841,7 @@ case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ sdcdb-next-from-src\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11207,6 +11851,9 @@ case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+SDCDB next command 
+\newline 
+;; b\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11215,15 +11862,12 @@ case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 1: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 3: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ sdcdb-back-from-src\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11233,6 +11877,9 @@ case 3: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+SDCDB back command 
+\newline 
+;; c\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11246,19 +11893,19 @@ case 3: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ sdcdb-cont-from-src\SpecialChar ~
 \SpecialChar ~
-case 2: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 6: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+SDCDB continue command
+\newline 
+;; s\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11272,6 +11919,7 @@ case 6: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ sdcdb-step-from-src\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11279,10 +11927,11 @@ case 6: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 3: ...
+\SpecialChar ~
+\SpecialChar ~
+SDCDB step command 
 \newline 
-}\SpecialChar ~
+;; ?\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11296,6 +11945,7 @@ case 3: ...
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ sdcdb-whatis-c-sexp\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11305,6 +11955,9 @@ case 3: ...
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+SDCDB ptypecommand for data at 
+\newline 
+;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11318,350 +11971,59 @@ case 3: ...
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-}
-\layout Standard
-
-Both the above switch statements will be implemented using a jump-table.
- The example to the right side is slightly more efficient as the check for
- the lower bound of the jump-table is not needed.
-\end_deeper 
-\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, e.g.:
-\layout Verse
-
-
-\family typewriter 
-switch (i) { 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 1: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 2: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 3: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 4: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 9: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 10: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 11: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 12: ...
-\newline 
-}
-\layout Standard
-
-If the above switch statement is broken down into two switch statements
-\layout Verse
-
-
-\family typewriter 
-switch (i) { 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 1: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 2: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 3: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 4: ...
-\newline 
-}
-\layout Standard
-
-and
-\layout Verse
-
-
-\family typewriter 
-switch (i) { 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 9: \SpecialChar ~
-...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 10: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 11: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 12:\SpecialChar ~
-...
-\newline 
-}
-\layout Standard
-
-then both the switch statements will be implemented using jump-tables whereas
- the unmodified switch statement will not be.
- You might also consider dummy cases 0 and 5 to 8 in this example.
- The pragma NOJTBOUND
-\begin_inset LatexCommand \index{\#pragma NOJTBOUND}
-
-\end_inset 
-
- can be used to turn off checking the 
-\emph on 
-j
-\emph default 
-ump 
-\emph on 
-t
-\emph default 
-able 
-\emph on 
-bound
-\emph default 
-aries.
-\layout Subsubsection
-
-Bit-shifting Operations
-\begin_inset LatexCommand \index{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, e.g.:
-\layout Verse
-
-
-\family typewriter 
-unsigned char i;
-\newline 
-...
-\newline 
-i >>= 4; 
-\newline 
-...
-\layout Standard
-
-generates the following code:
-\layout Verse
-
-
-\family typewriter 
-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 Verse
-
-
-\family typewriter 
-unsigned int i; 
-\newline 
-...
-\newline 
-i >>= 9; 
+ buffer point 
 \newline 
-...
-\layout Standard
-
-will generate:
-\layout Verse
-
-
-\family typewriter 
-mov\SpecialChar ~
+;; x\SpecialChar ~
 \SpecialChar ~
-a,(_i + 1) 
-\newline 
-mov\SpecialChar ~
 \SpecialChar ~
-(_i + 1),#0x00 
-\newline 
-clr\SpecialChar ~
 \SpecialChar ~
-c 
-\newline 
-rrc\SpecialChar ~
 \SpecialChar ~
-a 
-\newline 
-mov\SpecialChar ~
 \SpecialChar ~
-_i,a
-\layout Standard
-
-Note that SDCC stores numbers in little-endian format (i.e.
- lowest order first).
-\layout Subsubsection
-
-Bit-rotation
-\begin_inset LatexCommand \index{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 Verse
-
-
-\family typewriter 
-unsigned char i; 
-\newline 
-...
-\newline 
-i = ((i << 1) | (i >> 7)); 
-\family default 
-
-\newline 
-
-\family typewriter 
-...
-\layout Standard
-
-will generate the following code:
-\layout Verse
-
-
-\family typewriter 
-mov\SpecialChar ~
 \SpecialChar ~
-a,_i 
-\newline 
-rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-a 
-\newline 
-mov\SpecialChar ~
 \SpecialChar ~
-_i,a
-\layout Standard
-
-SDCC uses pattern matching on the parse tree to determine this operation.Variatio
-ns of this case will also be recognized as bit-rotation, i.e.: 
-\layout Verse
-
-
-\family typewriter 
-i = ((i >> 7) | (i << 1)); /* left-bit rotation */
-\layout Subsubsection
-
-Highest Order Bit
-\begin_inset LatexCommand \index{Highest Order Bit}
-
-\end_inset 
-
-
-\layout Standard
-
-It is frequently required to obtain the highest order bit of an integral
- type (long, int, short or char types).
- SDCC recognizes the following expression to yield the highest order bit
- and generates optimized code for it, e.g.:
-\layout Verse
-
-
-\family typewriter 
-unsigned int gint; 
-\newline 
-
-\newline 
-foo () { 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-unsigned char hob; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-...
-\newline 
+ sdcdbsrc-delete\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-hob = (gint >> 15) & 1; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-..
-\newline 
-}
-\layout Standard
-
-will generate the following code:
-\layout Verse
-
-
-\family typewriter 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11671,6 +12033,9 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+SDCDB Delete all breakpoints if no arg 
+\newline 
+;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11687,10 +12052,6 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 61 ;\SpecialChar ~
- hob.c 7 
-\newline 
-000A E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11705,7 +12066,6 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 62\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11713,11 +12073,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- mov\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
-\newline 
-000C 23\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11725,6 +12081,9 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+given or delete arg (C-u arg x) 
+\newline 
+;; m\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11735,20 +12094,16 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 63\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ sdcdbsrc-frame\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- a 
-\newline 
-000D 54 01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11757,13 +12112,15 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+SDCDB Display current frame if no arg, 
+\newline 
+;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 64\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11771,11 +12128,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- anl\SpecialChar ~
 \SpecialChar ~
- a,#0x01 
-\newline 
-000F F5*02\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -11790,826 +12143,14 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 65\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- _foo_hob_1_1,a
-\layout Standard
-
-Variations of this case however will 
-\emph on 
-not
-\emph default 
- 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,
- e.g.:
-\layout Verse
-
-
-\family typewriter 
-xyz = gint + ((gint >> 15) & 1);
-\layout Standard
-
-will still be recognized.
-\layout Subsubsection
-
-Peephole Optimizer
-\begin_inset LatexCommand \index{Peephole optimizer}
-
-\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 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--peep-file
-\begin_inset LatexCommand \index{-\/-peep-file}
-
-\end_inset 
-
- <filename>
-\emph default 
- option.
- The rule language is best illustrated with examples.
-\layout Verse
-
-
-\family typewriter 
-replace { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-mov %1,a 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-mov a,%1
-\newline 
-} by {
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-mov %1,a
-\newline 
-}
-\layout Standard
-
-The above rule will change the following assembly
-\begin_inset LatexCommand \index{Assembler routines}
-
-\end_inset 
-
- sequence:
-\layout Verse
-
-
-\family typewriter 
-mov r1,a 
-\newline 
-mov a,r1
-\layout Standard
-
-to
-\layout Verse
-
-
-\family typewriter 
-mov r1,a
-\layout Standard
-
-Note: All occurrences of a 
-\emph on 
-%n
-\emph default 
- (pattern variable) must denote the same string.
- With the above rule, the assembly sequence:
-\layout Verse
-
-
-\family typewriter 
-mov r1,a 
-\newline 
-mov a,r2
-\layout Standard
-
-will remain unmodified.
-\newline 
-
-\newline 
-Other special case optimizations may be added by the user (via 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--peep-file option
-\emph default 
-).
- E.g.
- some variants of the 8051 MCU allow only 
-\family typewriter 
-ajmp
-\family default 
- and 
-\family typewriter 
-acall
-\family default 
-.
- The following two rules will change all 
-\family typewriter 
-ljmp
-\family default 
- and 
-\family typewriter 
-lcall
-\family default 
- to 
-\family typewriter 
-ajmp
-\family default 
- and 
-\family typewriter 
-acall
-\layout Verse
-
-
-\family typewriter 
-replace { lcall %1 } by { acall %1 } 
-\newline 
-replace { ljmp %1 } by { ajmp %1 }
-\layout Standard
-
-The 
-\emph on 
-inline-assembler code
-\emph default 
- 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.
-\newline 
-
-\newline 
-The syntax for a rule is as follows:
-\layout Verse
-
-
-\family typewriter 
-rule := replace [ restart ] '{' <assembly sequence> '
-\backslash 
-n' 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- '}' by '{' '
-\backslash 
-n' 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- <assembly sequence> '
-\backslash 
-n' 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
- '}' [if <functionName> ] '
-\backslash 
-n' 
-\layout Standard
-
-<assembly sequence> := assembly instruction (each instruction including
- labels must be on a separate line).
-\newline 
-
-\newline 
-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 'restart' 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.
- An example of this (not a good one, it has side effects) is the following
- rule:
-\layout Verse
-
-
-\family typewriter 
-replace restart { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-pop %1 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-push %1 } by { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-; nop 
-\newline 
-}
-\layout Standard
-
-Note that the replace pattern cannot be a blank, but can be a comment line.
- Without the 'restart' option only the inner most 'pop' 'push' pair would
- be eliminated, i.e.:
-\layout Verse
-
-
-\family typewriter 
-pop ar1 
-\newline 
-pop ar2 
-\newline 
-push ar2 
-\newline 
-push ar1
-\layout Standard
-
-would result in:
-\layout Verse
-
-
-\family typewriter 
-pop ar1 
-\newline 
-; nop 
-\newline 
-push ar1
-\layout Standard
-
-
-\emph on 
-with
-\emph default 
- the restart option the rule will be applied again to the resulting code
- and then all the pop-push pairs will be eliminated to yield:
-\layout Verse
-
-
-\family typewriter 
-; 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 Verse
-
-
-\family typewriter 
-replace { 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
-ljmp %5 
-\newline 
-%2:
-\newline 
-} by { 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- \SpecialChar ~
-sjmp %5 
-\newline 
-%2:
-\newline 
-} 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 SDCCpeeph.c, with the name 
-\emph on 
-labelInRange
-\emph default 
-.
- If it finds a corresponding entry the function is called.
- Note there can be no parameters specified for these functions, in this
- 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
- labelInRange and the calling mechanism in source file SDCCpeeph.c.
- Currently implemented are 
-\emph on 
-labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption,
- 24bitMode, portIsDS390, 24bitModeAndPortDS390 
-\emph default 
-and
-\emph on 
- notVolatile
-\emph default 
-.
-\layout Standard
-
-I know this whole thing is a little kludgey, but maybe some day we will
- have some better means.
- If you are looking at this file, you will see the default rules that are
- compiled into the compiler, you can add your own rules in the default set
- there if you get tired of specifying the -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--peep-file option.
-\layout Subsection
-
-Pragmas
-\begin_inset LatexCommand \index{Pragmas}
-
-\end_inset 
-
-
-\layout Standard
-
-SDCC supports the following #pragma directives.
-\layout Itemize
-
-SAVE
-\begin_inset LatexCommand \index{\#pragma SAVE}
-
-\end_inset 
-
- - this will save all current options to the SAVE/RESTORE stack.
- See RESTORE.
-\layout Itemize
-
-RESTORE
-\begin_inset LatexCommand \index{\#pragma RESTORE}
-
-\end_inset 
-
- - will restore saved options from the last save.
- SAVEs & RESTOREs can be nested.
- SDCC uses a SAVE/RESTORE stack: SAVE pushes current options to the stack,
- RESTORE pulls current options from the stack.
- See SAVE.
-\layout Itemize
-
-NOGCSE
-\begin_inset LatexCommand \index{\#pragma NOGCSE}
-
-\end_inset 
-
- - will stop global common subexpression elimination.
-\layout Itemize
-
-NOINDUCTION
-\begin_inset LatexCommand \index{\#pragma NOINDUCTION}
-
-\end_inset 
-
- - will stop loop induction optimizations.
-\layout Itemize
-
-NOJTBOUND
-\begin_inset LatexCommand \index{\#pragma NOJTBOUND}
-
-\end_inset 
-
- - will not generate code for boundary value checking, when switch statements
- are turned into jump-tables (dangerous).
-\layout Itemize
-
-NOOVERLAY
-\begin_inset LatexCommand \index{\#pragma NOOVERLAY}
-
-\end_inset 
-
- - the compiler will not overlay the parameters and local variables of a
- function.
-\layout Itemize
-
-LESS_PEDANTIC
-\begin_inset LatexCommand \index{\#pragma LESS\_PEDANTIC}
-
-\end_inset 
-
- - the compiler will not warn you anymore for obvious mistakes, you'r on
- your own now ;-(
-\layout Itemize
-
-NOLOOPREVERSE
-\begin_inset LatexCommand \index{\#pragma NOLOOPREVERSE}
-
-\end_inset 
-
- - Will not do loop reversal optimization
-\layout Itemize
-
-EXCLUDE
-\begin_inset LatexCommand \index{\#pragma EXCLUDE}
-
-\end_inset 
-
- NONE | {acc[,b[,dpl[,dph]]] - The exclude pragma disables generation of
- pair of push/pop
-\begin_inset LatexCommand \index{push/pop}
-
-\end_inset 
-
- instruction in ISR function (using interrupt
-\begin_inset LatexCommand \index{interrupt}
-
-\end_inset 
-
- 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 #pragma\SpecialChar ~
-EXCLUDE\SpecialChar ~
-none
-\begin_inset LatexCommand \index{\#pragma EXCLUDE}
-
-\end_inset 
-
-.
-\layout Itemize
-
-NOIV
-\begin_inset LatexCommand \index{\#pragma NOIV}
-
-\end_inset 
-
- - Do not generate interrupt vector table entries for all ISR functions
- defined after the pragma.
- This is useful in cases where the interrupt vector table must be defined
- manually, or when there is a secondary, manually defined interrupt vector
- table (e.g.
- for the autovector feature of the Cypress EZ-USB FX2).
-\layout Itemize
-
-CALLEE-SAVES
-\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{function prologue}
-
-\end_inset 
-
- function1[,function2[,function3...]] - The compiler by default uses a caller
- saves convention for register saving across function calls, however this
- can cause unnecessary register pushing & popping when calling small functions
- from larger functions.
- This option can be used to switch off the register saving convention for
- the function names specified.
- The compiler will not save registers when calling these functions, extra
- code need to be manually inserted at the entry & exit for these functions
- to save & restore the registers used by these functions, this can SUBSTANTIALLY
- reduce code & improve run time performance of the generated code.
- In the future the compiler (with inter procedural analysis) may be able
- to determine the appropriate scheme to use for each function call.
- If -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--callee-saves command line option is used, the function names specified
- in #pragma\SpecialChar ~
-CALLEE-SAVES
-\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES}
-
-\end_inset 
-
- is appended to the list of functions specified in the 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 before and/or after a function, placing pragma's inside
- a function body could have unpredictable results.
-\layout Verse
-
-
-\family typewriter 
-#pragma SAVE
-\begin_inset LatexCommand \index{\#pragma SAVE}
-
-\end_inset 
-
- \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* save the current settings */ 
-\newline 
-#pragma NOGCSE
-\begin_inset LatexCommand \index{\#pragma NOGCSE}
-
-\end_inset 
-
- \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* turnoff global subexpression elimination */ 
-\newline 
-#pragma NOINDUCTION
-\begin_inset LatexCommand \index{\#pragma NOINDUCTION}
-
-\end_inset 
-
- /* turn off induction optimizations */ 
-\newline 
-int foo () 
-\newline 
-{ 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- ...
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- /* large code */ 
-\newline 
-\SpecialChar ~
- \SpecialChar ~
- ...
-\newline 
-} 
-\newline 
-#pragma RESTORE
-\begin_inset LatexCommand \index{\#pragma RESTORE}
-
-\end_inset 
-
- /* turn the optimizations back on */
-\layout Standard
-
-The compiler will generate a warning message when extra space is allocated.
- It is strongly recommended that the SAVE and RESTORE pragma's be used when
- changing options for a function.
-\layout Subsection
-
-Library Routines
-\emph on 
-\layout Standard
-
-
-\emph on 
-<pending: this is messy and incomplete>
-\emph default 
-\layout Enumerate
-
-Compiler support routines (_gptrget, _mulint etc)
-\layout Enumerate
-
-Stdclib functions (puts, printf, strcat etc)
-\layout Enumerate
-
-Math functions (sin, pow, sqrt etc)
-\layout Standard
-
-Libraries included in SDCC should have a license at least as liberal as
- the GNU Lesser General Public License
-\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL}
-
-\end_inset 
-
-\emph on 
-LGPL
-\emph default 
-.
-\layout Comment
-
-license statements for the libraries are missing.
- sdcc/device/lib/ser_ir.c f.e.
- comes with a GPL (as opposed to LGPL) License - this will not be liberal
- enough for many embedded programmers.
-\layout Subsection
-
-Interfacing with Assembly Routines
-\begin_inset LatexCommand \index{Assembler routines}
-
-\end_inset 
-
-
-\layout Subsubsection
-
-Global Registers used for Parameter Passing
-\begin_inset LatexCommand \index{Parameter passing}
-
-\end_inset 
-
-
-\layout Standard
-
-The compiler always uses the global registers 
-\emph on 
-DPL, DPH
-\begin_inset LatexCommand \index{DPTR, DPH, DPL}
-
-\end_inset 
-
-, B
-\begin_inset LatexCommand \index{B (register)}
-
-\end_inset 
-
-\emph default 
-and
-\emph on 
- ACC
-\begin_inset LatexCommand \index{ACC}
-
-\end_inset 
-
-
-\emph default 
- to pass the first parameter to a routine.
- The second parameter onwards is either allocated on the stack (for reentrant
- routines or if -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--stack-auto is used) or in data / xdata memory (depending on the memory
- model).
-\layout Subsubsection
-
-Assembler Routine(non-reentrant
-\begin_inset LatexCommand \index{reentrant}
-
-\end_inset 
-
-)
-\begin_inset LatexCommand \index{Assembler routines (non-reentrant)}
-
-\end_inset 
-
-
-\layout Standard
-
-In the following example the function c_func calls an assembler routine
- asm_func, which takes two parameters.
-\layout Verse
-
-
-\family typewriter 
-extern int asm_func(unsigned char, unsigned char);
-\newline 
-
-\newline 
-int c_func (unsigned char i, unsigned char j)
-\newline 
-{
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return asm_func(i,j);
-\newline 
-}
-\newline 
-
-\newline 
-int main()
-\newline 
-{
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return c_func(10,9);
-\newline 
-}
-\layout Standard
-
-The corresponding assembler function is:
-\layout Verse
-
-
-\family typewriter 
-.globl _asm_func_PARM_2 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12618,20 +12159,17 @@ The corresponding assembler function is:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-.globl _asm_func 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
+given or display frame arg 
+\newline 
+;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-.area OSEG 
-\newline 
-_asm_func_PARM_2:
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12640,8 +12178,6 @@ _asm_func_PARM_2:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-.ds     1 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12650,10 +12186,6 @@ _asm_func_PARM_2:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-.area CSEG 
-\newline 
-_asm_func: 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12662,8 +12194,6 @@ _asm_func:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov    a,dpl 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12672,8 +12202,6 @@ mov    a,dpl
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add    a,_asm_func_PARM_2 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12682,8 +12210,9 @@ add    a,_asm_func_PARM_2
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov    dpl,a 
+buffer point 
 \newline 
+;; !\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -12692,511 +12221,261 @@ mov    dpl,a
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dpl
-\begin_inset LatexCommand \index{DPTR, DPH, DPL}
-
-\end_inset 
-
-,#0x00 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
+ sdcdbsrc-goto-sdcdb\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-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 _<function_name>_PARM_<n>, 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 variable name for the second parameter will be _<function_n
-ame>_PARM_2.
-\newline 
-
-\newline 
-Assemble the assembler routine with the following command:
-\newline 
-
-\newline 
-
-\family sans 
-\series bold 
-asx8051 -losg asmfunc.asm
-\newline 
-
-\newline 
-
-\family default 
-\series default 
-Then compile and link the assembler routine to the C source file with the
- following command:
-\newline 
-
-\newline 
-
-\family sans 
-\series bold 
-sdcc cfunc.c asmfunc.rel
-\layout Subsubsection
-
-Assembler Routine(reentrant
-\begin_inset LatexCommand \index{reentrant}
-
-\end_inset 
-
-)
-\begin_inset LatexCommand \index{Assembler routines (reentrant)}
-
-\end_inset 
-
-
-\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 Verse
-
-
-\family typewriter 
-extern int asm_func(unsigned char, unsigned char);
-\newline 
-
-\newline 
-int c_func (unsigned char i, unsigned char j) reentrant 
-\newline 
-{ 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Goto the SDCDB output buffer 
 \newline 
+;; p\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return asm_func(i,j); 
-\newline 
-} 
-\newline 
-
-\newline 
-int main() 
-\newline 
-{ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return c_func(10,9); 
-\newline 
-}
-\layout Standard
-
-The corresponding assembler routine is:
-\layout Verse
-
-
-\family typewriter 
-.globl _asm_func 
-\newline 
-_asm_func: 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-push  _bp 
-\newline 
 \SpecialChar ~
+ sdcdb-print-c-sexp\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov _bp,sp 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  r2,dpl
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB print command for data at 
 \newline 
+;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  a,_bp 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-clr  c 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add  a,#0xfd 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  r0,a 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add  a,#0xfc
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  r1,a 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  a,@r0 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add  a,r2
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  dpl,a 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  dph,#0x00 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  sp,_bp 
+\SpecialChar ~
+ buffer point 
 \newline 
+;; g\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop  _bp 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-goto-sdcdb\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Goto the SDCDB output buffer 
 \newline 
+;; t\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-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
-
-External Stack
-\begin_inset LatexCommand \label{sub:External-Stack}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{stack}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{External stack}
-
-\end_inset 
-
-
-\layout Standard
-
-The external stack is located at the start of the external ram segment,
- and is 256 bytes in size.
- When -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--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 -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--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 Subsection
-
-ANSI-Compliance
-\begin_inset LatexCommand \index{ANSI-compliance}
-
-\end_inset 
-
-
-\layout Standard
-
-Deviations from the compliance:
-\layout Itemize
-
-functions are not always reentrant.
-\layout Itemize
-
-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, e.g.:
-\begin_deeper 
-\layout Verse
-
-
-\family typewriter 
-struct s { ...
- }; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-mode\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Toggles Sdcdbsrc mode (turns it off) 
 \newline 
-struct s s1, s2
+;
 \newline 
-foo() 
+;; C-c C-f\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-finish-from-src\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SDCDB finish command 
 \newline 
-{ 
+;; 
+\newline 
+;; C-x SPC\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdb-break\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Set break for line with point 
 \newline 
+;; ESC t\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ sdcdbsrc-mode\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-...
-\newline 
-}
-\newline 
-struct s foo1 (struct s parms) /* invalid in SDCC although allowed in ANSI
- */
-\newline 
-{ 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Toggle Sdcdbsrc mode 
 \newline 
+;; ESC m\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-struct s rets; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-...
-\newline 
 \SpecialChar ~
+ sdcdbsrc-srcmode\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return rets;/* is invalid in SDCC although allowed in ANSI */ 
-\newline 
-}
-\end_deeper 
-\layout Itemize
-
-'long long
-\begin_inset LatexCommand \index{long long (not supported)}
-
-\end_inset 
-
-' (64 bit integers
-\begin_inset LatexCommand \index{int (64 bit) (not supported)}
-
-\end_inset 
-
-) not supported.
-\layout Itemize
-
-'double
-\begin_inset LatexCommand \index{double (not supported)}
-
-\end_inset 
-
-' precision floating point 
-\begin_inset LatexCommand \index{Floating point support}
-
-\end_inset 
-
-not supported.
-\layout Itemize
-
-No support for setjmp and longjmp (for now).
-\layout Itemize
-
-Old K&R style
-\begin_inset LatexCommand \index{K\&R style}
-
-\end_inset 
-
- function declarations are NOT allowed.
-\begin_deeper 
-\layout Verse
-
-
-\family typewriter 
-foo(i,j) /* this old style of function declarations */ 
-\newline 
-int i,j; /* are valid in ANSI but not valid in SDCC */ 
-\newline 
-{ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-...
-\newline 
-}
-\end_deeper 
-\layout Itemize
-
-functions declared as pointers must be dereferenced during the call.
-\begin_deeper 
-\layout Verse
-
-
-\family typewriter 
-int (*foo)();
-\newline 
-...
-\newline 
-/* has to be called like this */ 
-\newline 
-(*foo)(); /* ANSI standard allows calls to be made like 'foo()' */
-\end_deeper 
-\layout Subsection
-
-Cyclomatic Complexity
-\begin_inset LatexCommand \index{Cyclomatic complexity}
-
-\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.
- 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.
-\newline 
-
-\newline 
-SDCC uses the following formula to compute the complexity:
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ Toggle list mode 
 \newline 
-
-\layout Standard
-
-complexity = (number of edges in control flow graph) - (number of nodes
- in control flow graph) + 2;
+;; 
 \newline 
 
-\newline 
-Having said that the industry standard is 10, you should be aware that in
- some cases it be 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
 \pagebreak_top 
 TIPS
@@ -14427,145 +13706,84 @@ sdcc/doc
 
 \layout Section
 \pagebreak_top 
-Retargetting for other MCUs.
-\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 Itemize
-
-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 Itemize
-
-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 -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
+Support
+\begin_inset LatexCommand \index{Support}
 
-\backslash 
-/
 \end_inset 
 
--dumpraw option.
-\layout Itemize
 
-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:
-\newline 
+\layout Standard
 
-\newline 
-Break down intermediate code (iCode) into basic blocks.
-\newline 
-Do control flow & data flow analysis on the basic blocks.
-\newline 
-Do local common subexpression elimination, then global subexpression elimination
-\newline 
-Dead code elimination
-\newline 
-Loop optimizations
-\newline 
-If loop optimizations caused any changes then do 'global subexpression eliminati
-on' and 'dead code elimination' again.
-\layout Itemize
+SDCC has grown to be a large project.
+ The compiler alone (without the preprocessor, assembler and linker) is
+ about 40,000 lines of code (blank stripped).
+ The open source nature of this project is a key to its continued growth
+ and support.
+ You gain the benefit and support of many active software developers and
+ end users.
+ Is SDCC perfect? No, that's why we need your help.
+ The developers take pride in fixing reported bugs.
+ You can help by reporting the bugs and helping other SDCC users.
+ There are lots of ways to contribute, and we encourage you to take part
+ in making SDCC a great software package.
+\layout Standard
 
-This phase determines the live-ranges; by live range I mean those iTemp
- variables defined by the compiler that still survive after all the optimization
-s.
- Live range analysis
-\begin_inset LatexCommand \index{Live range analysis}
+The SDCC project is hosted on the sdcc sourceforge site at 
+\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc}
 
 \end_inset 
 
- is essential for register allocation, since these computation determines
- which of these iTemps will be assigned to registers, and for how long.
-\layout Itemize
-
-Phase five is register allocation.
- There are two parts to this process.
-\newline 
+.
+ You'll find the complete set of mailing lists
+\begin_inset LatexCommand \index{Mailing list}
 
-\newline 
-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.
-\newline 
+\end_inset 
 
-\newline 
-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.
-\layout Itemize
+, forums, bug reporting system, patch submission
+\begin_inset LatexCommand \index{Patch submission}
 
-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 Itemize
+\end_inset 
 
-As mentioned in the optimization section the peep-hole optimizer is rule
- based system, which can reprogrammed for other MCUs.
-\layout Section
-\pagebreak_top 
-SDCDB
-\begin_inset LatexCommand \index{sdcdb}
+ system, download
+\begin_inset LatexCommand \index{download}
 
 \end_inset 
 
- - Source Level Debugger
-\begin_inset LatexCommand \index{Debugger}
+ area and cvs code repository
+\begin_inset LatexCommand \index{cvs code repository}
 
 \end_inset 
 
+ there.
+\layout Subsection
 
-\layout Standard
+Reporting Bugs
+\begin_inset LatexCommand \index{Bugs}
 
-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
-\begin_inset LatexCommand \index{gdb}
+\end_inset 
+
+
+\begin_inset LatexCommand \index{Reporting bugs}
 
 \end_inset 
 
- (the GNU debugger) as possible.
- The configuration and build process is part of the standard compiler installati
-on, which also builds and installs the debugger in the target directory
- specified during configuration.
- The debugger allows you debug BOTH at the C source and at the ASM source
- level.
- Sdcdb is available on Unix platforms only.
-\layout Subsection
 
-Compiling for Debugging
 \layout Standard
 
-The \SpecialChar \-
-\SpecialChar \-
-debug option must be specified for all files for which debug information
- is to be generated.
- The complier generates a .adb file for each of these files.
- The linker creates the .cdb file from the .adb files and the address information.
- This .cdb is used by the debugger.
-\layout Subsection
-
-How the Debugger Works
+The recommended way of reporting bugs is using the infrastructure of the
+ sourceforge site.
+ You can follow the status of bug reports there and have an overview about
+ the known bugs.
 \layout Standard
 
-When the -
+Bug reports are automatically forwarded to the developer mailing list and
+ will be fixed ASAP.
+ When reporting a bug, it is very useful to include a small test program
+ (the smaller the better) which reproduces the problem.
+ If you can isolate the problem by looking at the generated assembly code,
+ this can be very helpful.
+ Compiling your program with the -
 \begin_inset ERT
 status Collapsed
 
@@ -14575,590 +13793,718 @@ status Collapsed
 /
 \end_inset 
 
--debug 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 .adb file.
-  Then the linker creates the .cdb file from the individual .adb files with
- the address information for the symbols.
- The debugger reads the symbolic information generated by the compiler &
- the address information generated by the linker.
- It uses the SIMULATOR (Daniel's S51) to execute the program, the program
- execution is controlled by the debugger.
- When a command is issued for the debugger, it translates it into appropriate
- commands for the simulator.
-\layout Subsection
+-dumpall
+\begin_inset LatexCommand \index{-\/-dumpall}
 
-Starting the Debugger
-\layout Standard
+\end_inset 
 
-The debugger can be started using the following command line.
- (Assume the file you are debugging has the file name foo).
-\newline 
+ option can sometimes be useful in locating optimization problems.
+ When reporting a bug please maker sure you:
+\layout Enumerate
 
-\newline 
+Attach the code you are compiling with SDCC.
+\layout Enumerate
 
-\family sans 
-\series bold 
-sdcdb foo
-\newline 
+Specify the exact command you use to run SDCC, or attach your Makefile.
+\layout Enumerate
 
-\family default 
-\series default 
+Specify the SDCC version (type "sdcc -v"), your platform, and operating
+ system.
+\layout Enumerate
 
-\newline 
-The debugger will look for the following files.
-\layout Itemize
+Provide an exact copy of any error message or incorrect output.
+\layout Enumerate
 
-foo.c - the source file.
-\layout Itemize
+Put something meaningful in the subject of your message.
+\layout Standard
 
-foo.cdb - the debugger symbol information file.
-\layout Itemize
+Please attempt to include these 5 important parts, as applicable, in all
+ requests for support or when reporting any problems or bugs with SDCC.
+ Though this will make your message lengthy, it will greatly improve your
+ chance that SDCC users and developers will be able to help you.
+ Some SDCC developers are frustrated by bug reports without code provided
+ that they can use to reproduce and ultimately fix the problem, so please
+ be sure to provide sample code if you are reporting a bug! 
+\layout Standard
 
-foo.ihx - the Intel hex format
-\begin_inset LatexCommand \index{Intel hex format}
+Please have a short check that you are using a recent version of SDCC and
+ the bug is not yet known.
+ This is the link for reporting bugs: 
+\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599}
 
 \end_inset 
 
- object file.
+.
 \layout Subsection
 
-Command Line Options.
-\layout Itemize
+Requesting Features
+\begin_inset LatexCommand \label{sub:Requesting-Features}
 
--
-\begin_inset ERT
-status Collapsed
+\end_inset 
 
-\layout Standard
 
-\backslash 
-/
+\begin_inset LatexCommand \index{Feature request}
+
 \end_inset 
 
--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 -
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset LatexCommand \index{Requesting features}
 
-\backslash 
-/
 \end_inset 
 
--directory option should be -
-\begin_inset ERT
-status Collapsed
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+Like bug reports feature requests are forwarded to the developer mailing
+ list.
+ This is the link for requesting features: 
+\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
 
--directory=/home/src1:/home/src2.
- Note there can be no spaces in the option.
-\layout Itemize
+\end_inset 
 
--cd <directory> - change to the <directory>.
-\layout Itemize
+.
+\layout Subsection
 
--fullname - used by GUI front ends.
-\layout Itemize
+Getting Help
+\layout Standard
 
--cpu <cpu-type> - this argument is passed to the simulator please see the
- simulator docs for details.
-\layout Itemize
+These links should take you directly to the 
+\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599}
 
--X <Clock frequency > this options is passed to the simulator please see
- the simulator docs for details.
-\layout Itemize
+\end_inset 
 
--s <serial port file> passed to simulator see the simulator docs for details.
-\layout Itemize
 
--S <serial in,out> passed to simulator see the simulator docs for details.
-\layout Subsection
+\begin_inset Foot
+collapsed false
 
-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 the integration with existing graphical user interfaces
- (like ddd, xxgdb or xemacs) existing for the GNU debugger.
-\layout Subsubsection
+Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting
+ automated messages (mid 2003)
+\end_inset 
 
-break [line | file:line | function | file:function]
-\layout Standard
+ and the 
+\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599}
 
-Set breakpoint at specified line or function:
-\newline 
+\end_inset 
 
-\newline 
+, lists and forums are archived so if you are lucky someone already had
+ a similar problem.
+\layout Subsection
+
+ChangeLog
+\begin_inset LatexCommand \index{Changelog}
+
+\end_inset 
 
-\family sans 
-\series bold 
-sdcdb>break 100 
-\newline 
-sdcdb>break foo.c:100
-\newline 
-sdcdb>break funcfoo
-\newline 
-sdcdb>break foo.c:funcfoo
-\layout Subsubsection
 
-clear [line | file:line | function | file:function ]
 \layout Standard
 
-Clear breakpoint at specified line or function:
-\newline 
+You can follow the status of the cvs version
+\begin_inset LatexCommand \index{version}
 
-\newline 
+\end_inset 
 
-\family sans 
-\series bold 
-sdcdb>clear 100
-\newline 
-sdcdb>clear foo.c:100
-\newline 
-sdcdb>clear funcfoo
-\newline 
-sdcdb>clear foo.c:funcfoo
-\layout Subsubsection
+ of SDCC by watching the file 
+\begin_inset LatexCommand \htmlurl[ChangeLog]{http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/sdcc/sdcc/ChangeLog?rev=HEAD&content-type=text/plain}
 
-continue
-\layout Standard
+\end_inset 
 
-Continue program being debugged, after breakpoint.
-\layout Subsubsection
+ in the cvs-repository.
+\layout Subsection
 
-finish
-\layout Standard
+Release policy
+\begin_inset LatexCommand \index{Release policy}
+
+\end_inset 
 
-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
+Historically there often were long delays between official releases and
+ the sourceforge download area tends to get not updated at all.
+ Current excuses might refer to problems with live range analysis, but if
+ this is fixed, the next problem rising is that another excuse will have
+ to be found.
+ Kidding aside, we have to get better there! On the other hand there are
+ daily snapshots available at 
+\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php}
 
-info [break | stack | frame | registers ]
-\layout Itemize
+\end_inset 
 
-info break - list all breakpoints
-\layout Itemize
+, and you can always built the very last version (hopefully with many bugs
+ fixed, and features added) from the source code available at 
+\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source}
 
-info stack - show the function call stack.
-\layout Itemize
+\end_inset 
 
-info frame - show information about the current execution frame.
-\layout Itemize
+.
+\layout Subsection
 
-info registers - show content of all registers.
-\layout Subsubsection
+Examples
+\begin_inset LatexCommand \index{Examples}
 
-step
-\layout Standard
+\end_inset 
 
-Step program until it reaches a different source line.
-\layout Subsubsection
 
-next
 \layout Standard
 
-Step program, proceeding through subroutine calls.
-\layout Subsubsection
+You'll find some small examples in the directory sdcc/device/examples/
+\layout Comment
 
-run
-\layout Standard
+Maybe we should include some links to real world applications.
+ Preferably pointer to pointers (one for each architecture) so this stays
+ manageable here?
+\layout Subsection
 
-Start debugged program.
-\layout Subsubsection
+Quality control
+\begin_inset LatexCommand \index{Quality control}
 
-ptype variable 
-\layout Standard
+\end_inset 
 
-Print type information of the variable.
-\layout Subsubsection
 
-print variable
 \layout Standard
 
-print value of variable.
-\layout Subsubsection
+The compiler is passed through nightly compile and build checks.
+ The so called 
+\shape italic 
+regression tests
+\shape default 
 
-file filename
-\layout Standard
+\begin_inset LatexCommand \index{Regression test}
 
-load the given file name.
- Note this is an alternate method of loading file for debugging.
-\layout Subsubsection
+\end_inset 
 
-frame
-\layout Standard
+ check that SDCC itself compiles flawlessly on several platforms and checks
+ the quality of the code generated by SDCC by running the code through simulator
+s.
+ There is a separate document 
+\shape italic 
+test_suite.pdf
+\begin_inset LatexCommand \index{Test suite}
 
-print information about current frame.
-\layout Subsubsection
+\end_inset 
 
-set srcmode
+
+\shape default 
+ about this.
 \layout Standard
 
-Toggle between C source & assembly source.
-\layout Subsubsection
+You'll find the test code in the directory 
+\shape italic 
+sdcc/support/regression
+\shape default 
+.
+ You can run these tests manually by running 
+\family sans 
+make
+\family default 
+ in this directory (or f.e.
+\family sans 
+make test-mcs51
+\family default 
+ if you don't want to run the complete tests).
+ The test code might also be interesting if you want to look for examples
+\begin_inset LatexCommand \index{Examples}
 
-! simulator command
-\layout Standard
+\end_inset 
 
-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
+ checking corner cases of SDCC or if you plan to submit patches
+\begin_inset LatexCommand \index{Patch submission}
 
-quit.
+\end_inset 
+
+.
 \layout Standard
 
-"Watch me now.
- Iam going Down.
- My name is Bobby Brown"
+The pic port uses a different set of regression tests, you'll find them
+ in the directory 
+\shape italic 
+sdcc/src/regression
+\shape default 
+.
+\layout Section
+\pagebreak_top 
+SDCC Technical Data
 \layout Subsection
 
-Interfacing with XEmacs
-\begin_inset LatexCommand \index{XEmacs}
+Optimizations
+\begin_inset LatexCommand \index{Optimizations}
 
 \end_inset 
 
 
-\begin_inset LatexCommand \index{Emacs}
+\layout Standard
+
+SDCC performs a host of standard optimizations in addition to some MCU specific
+ optimizations.
+\layout Subsubsection
+
+Sub-expression Elimination
+\begin_inset LatexCommand \index{Subexpression elimination}
 
 \end_inset 
 
-.
+
 \layout Standard
 
-Two files (in emacs lisp) are provided for the interfacing with XEmacs,
- sdcdb.el and sdcdbsrc.el.
- These two files can be found in the $(prefix)/bin directory after the installat
-ion is complete.
- These files need to be loaded into XEmacs for the interface to work.
- This can be done at XEmacs startup time by inserting the following into
- your '.xemacs' file (which can be found in your HOME directory): 
-\newline 
+The compiler does local and global common subexpression elimination, e.g.:
+\layout Verse
 
-\newline 
 
 \family typewriter 
-(load-file sdcdbsrc.el) 
-\family default 
-
+i = x + y + 1; 
 \newline 
+j = x + y;
+\layout Standard
+
+will be translated to
+\layout Verse
+
 
+\family typewriter 
+iTemp = x + y; 
 \newline 
-.xemacs is a lisp file so the () around the command is REQUIRED.
- The files can also be loaded dynamically while XEmacs is running, set the
- environment variable 'EMACSLOADPATH' to the installation bin directory
- (<installdir>/bin), then enter the following command ESC-x load-file sdcdbsrc.
- To start the interface enter the following command: 
+i = iTemp + 1; 
 \newline 
+j = iTemp;
+\layout Standard
 
-\newline 
+Some subexpressions are not as obvious as the above example, e.g.:
+\layout Verse
 
-\family sans 
-\series bold 
-ESC-x sdcdbsrc
-\family default 
-\series default 
 
+\family typewriter 
+a->b[i].c = 10; 
 \newline 
+a->b[i].d = 11;
+\layout Standard
+
+In this case the address arithmetic a->b[i] will be computed only once;
+ the equivalent code in C would be.
+\layout Verse
 
+
+\family typewriter 
+iTemp = a->b[i]; 
 \newline 
-You will prompted to enter the file name to be debugged.
+iTemp.c = 10; 
 \newline 
+iTemp.d = 11;
+\layout Standard
 
-\newline 
-The command line options that are passed to the simulator directly are bound
- to default values in the file sdcdbsrc.el.
- The variables are listed below, these values maybe changed as required.
-\layout Itemize
+The compiler will try to keep these temporary variables in registers.
+\layout Subsubsection
 
-sdcdbsrc-cpu-type '51
-\layout Itemize
+Dead-Code Elimination
+\begin_inset LatexCommand \index{Dead-code elimination}
 
-sdcdbsrc-frequency '11059200
-\layout Itemize
+\end_inset 
 
-sdcdbsrc-serial nil
-\layout Standard
 
-The following is a list of key mapping for the debugger interface.
-\layout Standard
+\layout Verse
 
-\SpecialChar ~
 
 \family typewriter 
-
-\newline 
-;; Current Listing :: 
+int global;
 \newline 
-;;key\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-binding\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-Comment 
+
+\newline 
+void f () { 
 \newline 
-;;---\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-------\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+int i; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+i = 1; \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+/* dead store */ 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+global = 1;\SpecialChar ~
+/* dead store */ 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+global = 2; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+return; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
---------
+global = 3;\SpecialChar ~
+/* unreachable */ 
 \newline 
-;; 
+}
+\layout Standard
+
+will be changed to
+\layout Verse
+
+
+\family typewriter 
+int global;
 \newline 
-;; n\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- sdcdb-next-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB next command 
+
 \newline 
-;; b\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- sdcdb-back-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB back command 
+void f () {
 \newline 
-;; c\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
- sdcdb-cont-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB continue command
+global = 2; 
 \newline 
-;; s\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- sdcdb-step-from-src\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-SDCDB step command 
+return; 
+\newline 
+}
+\layout Subsubsection
+
+Copy-Propagation
+\begin_inset LatexCommand \index{Copy propagation}
+
+\end_inset 
+
+
+\layout Verse
+
+
+\family typewriter 
+int f() { 
 \newline 
-;; ?\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+int i, j; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+i = 10; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+j = i; 
+\newline 
 \SpecialChar ~
- sdcdb-whatis-c-sexp\SpecialChar ~
 \SpecialChar ~
+return j; 
+\newline 
+}
+\layout Standard
+
+will be changed to 
+\layout Verse
+
+
+\family typewriter 
+int f() { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+int i, j; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+i = 10; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+j = 10; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
-SDCDB ptypecommand for data at 
+return 10; 
+\newline 
+}
+\layout Standard
+
+Note: the dead stores created by this copy propagation will be eliminated
+ by dead-code elimination.
+\layout Subsubsection
+
+Loop Optimizations
+\begin_inset LatexCommand \index{Loop optimization}
+
+\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
+\begin_inset LatexCommand \index{Register allocation}
+
+\end_inset 
+
+, loop induction optimization causes an increase in register pressure, which
+ may cause unwanted spilling of other temporary variables into the stack
+\begin_inset LatexCommand \index{stack}
+
+\end_inset 
+
+ / 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 -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-noinduction option) or for a given function only using #pragma\SpecialChar ~
+NOINDUCTION
+\begin_inset LatexCommand \index{\#pragma NOINDUCTION}
+
+\end_inset 
+
+.
+\newline 
+
+\newline 
+Loop Invariant:
+\layout Verse
+
+
+\family typewriter 
+for (i = 0 ; i < 100 ; i ++) 
 \newline 
-;;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+f += k + l;
+\layout Standard
+
+changed to
+\layout Verse
+
+
+\family typewriter 
+itemp = k + l; 
+\newline 
+for (i = 0; i < 100; i++) 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+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.
+\newline 
+
+\newline 
+Strength Reduction
+\begin_inset LatexCommand \index{Strength reduction}
+
+\end_inset 
+
+, this optimization substitutes an expression by a cheaper expression:
+\layout Verse
+
+
+\family typewriter 
+for (i=0;i < 100; i++)
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ar[i*5] = i*3;
+\layout Standard
+
+changed to
+\layout Verse
+
+
+\family typewriter 
+itemp1 = 0; 
+\newline 
+itemp2 = 0; 
+\newline 
+for (i=0;i< 100;i++) { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ar[itemp1] = itemp2; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+itemp1 += 5; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+itemp2 += 3; 
+\newline 
+}
+\layout Standard
+
+The more expensive multiplication
+\begin_inset LatexCommand \index{Multiplication}
+
+\end_inset 
+
+ is changed to a less expensive addition.
+\layout Subsubsection
+
+Loop Reversing
+\begin_inset LatexCommand \index{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 compilers 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 
+
+\newline 
+
+\family typewriter 
+for(<symbol> = <expression>; <sym> [< | <=] <expression>; [<sym>++ | <sym>
+ += 1])
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+<for body>
+\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 Subsubsection
+
+Algebraic Simplifications
+\layout Standard
+
+SDCC does numerous algebraic simplifications, the following is a small sub-set
+ of these optimizations.
+\layout Verse
+
+
+\family typewriter 
+i = j + 0 ; /* changed to */ i = j; 
+\newline 
+i /= 2;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ /* 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
+\begin_inset LatexCommand \index{Subexpression}
+
+\end_inset 
+
+ given above are generally introduced by macro expansions or as a result
+ of copy/constant propagation.
+\layout Subsubsection
+
+'switch' Statements
+\begin_inset LatexCommand \index{switch statement}
+
+\end_inset 
+
+
+\layout Standard
+
+SDCC changes switch statements to jump tables
+\begin_inset LatexCommand \index{jump tables}
+
+\end_inset 
+
+ 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.
+\begin_deeper 
+\layout Verse
+
+
+\family typewriter 
+switch(i) {\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15169,9 +14515,6 @@ SDCDB ptypecommand for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- buffer point 
-\newline 
-;; x\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15185,12 +14528,14 @@ SDCDB ptypecommand for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- sdcdbsrc-delete\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+switch (i) { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 4: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15199,9 +14544,6 @@ SDCDB ptypecommand for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-SDCDB Delete all breakpoints if no arg 
-\newline 
-;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15219,9 +14561,13 @@ SDCDB Delete all breakpoints if no arg
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 0: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15247,23 +14593,17 @@ SDCDB Delete all breakpoints if no arg
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-given or delete arg (C-u arg x) 
+case 1: ...
 \newline 
-;; m\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 3: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- sdcdbsrc-frame\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15278,9 +14618,6 @@ given or delete arg (C-u arg x)
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-SDCDB Display current frame if no arg, 
-\newline 
-;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15288,9 +14625,13 @@ SDCDB Display current frame if no arg,
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 2: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 6: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15316,6 +14657,10 @@ SDCDB Display current frame if no arg,
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 3: ...
+\newline 
+}\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15327,9 +14672,6 @@ SDCDB Display current frame if no arg,
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-given or display frame arg 
-\newline 
-;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15354,63 +14696,350 @@ given or display frame arg
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+}
+\layout Standard
+
+Both the above switch statements will be implemented using a jump-table.
+ The example to the right side is slightly more efficient as the check for
+ the lower bound of the jump-table is not needed.
+\end_deeper 
+\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, e.g.:
+\layout Verse
+
+
+\family typewriter 
+switch (i) { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 1: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 2: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 3: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 4: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 9: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 10: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 11: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 12: ...
+\newline 
+}
+\layout Standard
+
+If the above switch statement is broken down into two switch statements
+\layout Verse
+
+
+\family typewriter 
+switch (i) { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 1: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 2: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
-buffer point 
+case 3: ...
 \newline 
-;; !\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+case 4: ...
+\newline 
+}
+\layout Standard
+
+and
+\layout Verse
+
+
+\family typewriter 
+switch (i) { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 9: \SpecialChar ~
+...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 10: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 11: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 12:\SpecialChar ~
+...
+\newline 
+}
+\layout Standard
+
+then both the switch statements will be implemented using jump-tables whereas
+ the unmodified switch statement will not be.
+ You might also consider dummy cases 0 and 5 to 8 in this example.
+ The pragma NOJTBOUND
+\begin_inset LatexCommand \index{\#pragma NOJTBOUND}
+
+\end_inset 
+
+ can be used to turn off checking the 
+\emph on 
+j
+\emph default 
+ump 
+\emph on 
+t
+\emph default 
+able 
+\emph on 
+bound
+\emph default 
+aries.
+\layout Subsubsection
+
+Bit-shifting Operations
+\begin_inset LatexCommand \index{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, e.g.:
+\layout Verse
+
+
+\family typewriter 
+unsigned char i;
+\newline 
+...
+\newline 
+i >>= 4; 
+\newline 
+...
+\layout Standard
+
+generates the following code:
+\layout Verse
+
+
+\family typewriter 
+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 Verse
+
+
+\family typewriter 
+unsigned int i; 
+\newline 
+...
+\newline 
+i >>= 9; 
+\newline 
+...
+\layout Standard
+
+will generate:
+\layout Verse
+
+
+\family typewriter 
+mov\SpecialChar ~
 \SpecialChar ~
+a,(_i + 1) 
+\newline 
+mov\SpecialChar ~
 \SpecialChar ~
- sdcdbsrc-goto-sdcdb\SpecialChar ~
+(_i + 1),#0x00 
+\newline 
+clr\SpecialChar ~
 \SpecialChar ~
+c 
+\newline 
+rrc\SpecialChar ~
 \SpecialChar ~
+a 
+\newline 
+mov\SpecialChar ~
 \SpecialChar ~
+_i,a
+\layout Standard
+
+Note that SDCC stores numbers in little-endian format (i.e.
+ lowest order first).
+\layout Subsubsection
+
+Bit-rotation
+\begin_inset LatexCommand \index{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 Verse
+
+
+\family typewriter 
+unsigned char i; 
+\newline 
+...
+\newline 
+i = ((i << 1) | (i >> 7)); 
+\family default 
+
+\newline 
+
+\family typewriter 
+...
+\layout Standard
+
+will generate the following code:
+\layout Verse
+
+
+\family typewriter 
+mov\SpecialChar ~
 \SpecialChar ~
+a,_i 
+\newline 
+rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+a 
+\newline 
+mov\SpecialChar ~
 \SpecialChar ~
+_i,a
+\layout Standard
+
+SDCC uses pattern matching on the parse tree to determine this operation.Variatio
+ns of this case will also be recognized as bit-rotation, i.e.: 
+\layout Verse
+
+
+\family typewriter 
+i = ((i >> 7) | (i << 1)); /* left-bit rotation */
+\layout Subsubsection
+
+Highest Order Bit
+\begin_inset LatexCommand \index{Highest Order Bit}
+
+\end_inset 
+
+
+\layout Standard
+
+It is frequently required to obtain the highest order bit of an integral
+ type (long, int, short or char types).
+ SDCC recognizes the following expression to yield the highest order bit
+ and generates optimized code for it, e.g.:
+\layout Verse
+
+
+\family typewriter 
+unsigned int gint; 
+\newline 
+
+\newline 
+foo () { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
-Goto the SDCDB output buffer 
+unsigned char hob; 
 \newline 
-;; p\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+hob = (gint >> 15) & 1; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+..
+\newline 
+}
+\layout Standard
+
+will generate the following code:
+\layout Verse
+
+
+\family typewriter 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15418,7 +15047,6 @@ Goto the SDCDB output buffer
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- sdcdb-print-c-sexp\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15429,9 +15057,6 @@ Goto the SDCDB output buffer
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-SDCDB print command for data at 
-\newline 
-;;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15440,6 +15065,10 @@ SDCDB print command for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 61 ;\SpecialChar ~
+ hob.c 7 
+\newline 
+000A E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15454,6 +15083,7 @@ SDCDB print command for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 62\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15461,7 +15091,11 @@ SDCDB print command for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ a,(_gint + 1) 
+\newline 
+000C 23\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15477,11 +15111,9 @@ SDCDB print command for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- buffer point 
-\newline 
-;; g\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 63\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15489,11 +15121,14 @@ SDCDB print command for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ a 
+\newline 
+000D 54 01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- sdcdbsrc-goto-sdcdb\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15503,12 +15138,10 @@ SDCDB print command for data at
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-Goto the SDCDB output buffer 
-\newline 
-;; t\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 64\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15516,10 +15149,13 @@ Goto the SDCDB output buffer
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ anl\SpecialChar ~
 \SpecialChar ~
+ a,#0x01 
+\newline 
+000F F5*02\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- sdcdbsrc-mode\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -15532,231 +15168,493 @@ Goto the SDCDB output buffer
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 65\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-Toggles Sdcdbsrc mode (turns it off) 
-\newline 
-;; 
-\newline 
-;; C-c C-f\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_hob_1_1,a
+\layout Standard
+
+Variations of this case however will 
+\emph on 
+not
+\emph default 
+ 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,
+ e.g.:
+\layout Verse
+
+
+\family typewriter 
+xyz = gint + ((gint >> 15) & 1);
+\layout Standard
+
+will still be recognized.
+\layout Subsubsection
+
+Peephole Optimizer
+\begin_inset LatexCommand \index{Peephole optimizer}
+
+\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 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-peep-file
+\begin_inset LatexCommand \index{-\/-peep-file}
+
+\end_inset 
+
+ <filename>
+\emph default 
+ option.
+ The rule language is best illustrated with examples.
+\layout Verse
+
+
+\family typewriter 
+replace { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
- sdcdb-finish-from-src\SpecialChar ~
+mov %1,a 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+mov a,%1
+\newline 
+} by {
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+mov %1,a
+\newline 
+}
+\layout Standard
+
+The above rule will change the following assembly
+\begin_inset LatexCommand \index{Assembler routines}
+
+\end_inset 
+
+ sequence:
+\layout Verse
+
+
+\family typewriter 
+mov r1,a 
+\newline 
+mov a,r1
+\layout Standard
+
+to
+\layout Verse
+
+
+\family typewriter 
+mov r1,a
+\layout Standard
+
+Note: All occurrences of a 
+\emph on 
+%n
+\emph default 
+ (pattern variable) must denote the same string.
+ With the above rule, the assembly sequence:
+\layout Verse
+
+
+\family typewriter 
+mov r1,a 
+\newline 
+mov a,r2
+\layout Standard
+
+will remain unmodified.
+\newline 
+
+\newline 
+Other special case optimizations may be added by the user (via 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-peep-file option
+\emph default 
+).
+ E.g.
+ some variants of the 8051 MCU allow only 
+\family typewriter 
+ajmp
+\family default 
+ and 
+\family typewriter 
+acall
+\family default 
+.
+ The following two rules will change all 
+\family typewriter 
+ljmp
+\family default 
+ and 
+\family typewriter 
+lcall
+\family default 
+ to 
+\family typewriter 
+ajmp
+\family default 
+ and 
+\family typewriter 
+acall
+\layout Verse
+
+
+\family typewriter 
+replace { lcall %1 } by { acall %1 } 
+\newline 
+replace { ljmp %1 } by { ajmp %1 }
+\layout Standard
+
+The 
+\emph on 
+inline-assembler code
+\emph default 
+ 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.
+\newline 
+
+\newline 
+The syntax for a rule is as follows:
+\layout Verse
+
+
+\family typewriter 
+rule := replace [ restart ] '{' <assembly sequence> '
+\backslash 
+n' 
+\newline 
 \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ '}' by '{' '
+\backslash 
+n' 
+\newline 
 \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ <assembly sequence> '
+\backslash 
+n' 
+\newline 
 \SpecialChar ~
-SDCDB finish command 
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ '}' [if <functionName> ] '
+\backslash 
+n' 
+\layout Standard
+
+<assembly sequence> := assembly instruction (each instruction including
+ labels must be on a separate line).
 \newline 
-;; 
+
 \newline 
-;; C-x SPC\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- sdcdb-break\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-Set break for line with point 
+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 'restart' 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.
+ An example of this (not a good one, it has side effects) is the following
+ rule:
+\layout Verse
+
+
+\family typewriter 
+replace restart { 
 \newline 
-;; ESC t\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- sdcdbsrc-mode\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-Toggle Sdcdbsrc mode 
+pop %1 
 \newline 
-;; ESC m\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- sdcdbsrc-srcmode\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+push %1 } by { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
- Toggle list mode 
+; nop 
 \newline 
-;; 
-\family default 
+}
+\layout Standard
+
+Note that the replace pattern cannot be a blank, but can be a comment line.
+ Without the 'restart' option only the inner most 'pop' 'push' pair would
+ be eliminated, i.e.:
+\layout Verse
 
+
+\family typewriter 
+pop ar1 
+\newline 
+pop ar2 
+\newline 
+push ar2 
 \newline 
+push ar1
+\layout Standard
 
-\layout Section
+would result in:
+\layout Verse
 
-Other Processors
-\layout Subsection
 
-The Z80 and gbz80 port
+\family typewriter 
+pop ar1 
+\newline 
+; nop 
+\newline 
+push ar1
 \layout Standard
 
-SDCC can target both the Zilog 
-\begin_inset LatexCommand \index{Z80}
 
-\end_inset 
+\emph on 
+with
+\emph default 
+ the restart option the rule will be applied again to the resulting code
+ and then all the pop-push pairs will be eliminated to yield:
+\layout Verse
 
- and the Nintendo Gameboy's Z80-like gbz80
-\begin_inset LatexCommand \index{GameBoy Z80}
 
-\end_inset 
+\family typewriter 
+; 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 Verse
+
+
+\family typewriter 
+replace { 
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ljmp %5 
+\newline 
+%2:
+\newline 
+} by { 
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+sjmp %5 
+\newline 
+%2:
+\newline 
+} 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 SDCCpeeph.c, with the name 
+\emph on 
+labelInRange
+\emph default 
+.
+ If it finds a corresponding entry the function is called.
+ Note there can be no parameters specified for these functions, in this
+ 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
+ labelInRange and the calling mechanism in source file SDCCpeeph.c.
+ Currently implemented are 
+\emph on 
+labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption,
+ 24bitMode, portIsDS390, 24bitModeAndPortDS390 
+\emph default 
+and
+\emph on 
+ notVolatile
+\emph default 
+.
+\layout Standard
+
+I know this whole thing is a little kludgey, but maybe some day we will
+ have some better means.
+ If you are looking at this file, you will see the default rules that are
+ compiled into the compiler, you can add your own rules in the default set
+ there if you get tired of specifying the -
+\begin_inset ERT
+status Collapsed
 
-.
- The port is incomplete - long support is incomplete (mul, div and mod are
- unimplemented), and both float and bitfield support is missing.
- Apart from that the code generated is correct.
 \layout Standard
 
-As always, the code is the authoritative 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 variables.
- IY is currently unused.
- Return values are stored in HL.
- One bad side effect of using IX as the base pointer is that a functions
- stack frame is limited to 127 bytes - this will be fixed in a later version.
-\layout Section
-\pagebreak_top 
-Support
-\begin_inset LatexCommand \index{Support}
-
+\backslash 
+/
 \end_inset 
 
+-peep-file option.
+\layout Subsection
 
+Library Routines
+\emph on 
 \layout Standard
 
-SDCC has grown to be a large project.
- The compiler alone (without the preprocessor, assembler and linker) is
- about 40,000 lines of code (blank stripped).
- The open source nature of this project is a key to its continued growth
- and support.
- You gain the benefit and support of many active software developers and
- end users.
- Is SDCC perfect? No, that's why we need your help.
- The developers take pride in fixing reported bugs.
- You can help by reporting the bugs and helping other SDCC users.
- There are lots of ways to contribute, and we encourage you to take part
- in making SDCC a great software package.
+
+\emph on 
+<pending: this is messy and incomplete>
+\emph default 
  
-\layout Standard
+\layout Enumerate
 
-The SDCC project is hosted on the sdcc sourceforge site at 
-\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc}
+Compiler support routines (_gptrget, _mulint etc)
+\layout Enumerate
 
-\end_inset 
+Stdclib functions (puts, printf, strcat etc)
+\layout Enumerate
 
-.
- You'll find the complete set of mailing lists
-\begin_inset LatexCommand \index{Mailing list}
+Math functions (sin, pow, sqrt etc)
+\layout Standard
+
+Libraries
+\begin_inset LatexCommand \index{Libraries}
 
 \end_inset 
 
-, forums, bug reporting system, patch submission
-\begin_inset LatexCommand \index{Patch submission}
+ included in SDCC should have a license at least as liberal as the GNU Lesser
+ General Public License
+\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL}
 
 \end_inset 
 
- system, download
-\begin_inset LatexCommand \index{download}
+\emph on 
+LGPL
+\emph default 
+.
+\layout Comment
 
-\end_inset 
+license statements for the libraries are missing.
+ sdcc/device/lib/ser_ir.c f.e.
+ comes with a GPL (as opposed to LGPL) License - this will not be liberal
+ enough for many embedded programmers.
+\layout Subsection
 
- area and cvs code repository
-\begin_inset LatexCommand \index{cvs code repository}
+External Stack
+\begin_inset LatexCommand \label{sub:External-Stack}
 
 \end_inset 
 
- there.
-\layout Subsection
 
-Reporting Bugs
-\begin_inset LatexCommand \index{Bugs}
+\begin_inset LatexCommand \index{stack}
 
 \end_inset 
 
 
-\begin_inset LatexCommand \index{Reporting bugs}
+\begin_inset LatexCommand \index{External stack}
 
 \end_inset 
 
 
 \layout Standard
 
-The recommended way of reporting bugs is using the infrastructure of the
- sourceforge site.
- You can follow the status of bug reports there and have an overview about
- the known bugs.
-\layout Standard
-
-Bug reports are automatically forwarded to the developer mailing list and
- will be fixed ASAP.
- When reporting a bug, it is very useful to include a small test program
- (the smaller the better) which reproduces the problem.
- If you can isolate the problem by looking at the generated assembly code,
- this can be very helpful.
- Compiling your program with the -
+The external stack is located at the start of the external ram segment,
+ and is 256 bytes in size.
+ When -
 \begin_inset ERT
 status Collapsed
 
@@ -15766,236 +15664,360 @@ status Collapsed
 /
 \end_inset 
 
--dumpall
-\begin_inset LatexCommand \index{-\/-dumpall}
+-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 -
+\begin_inset ERT
+status Collapsed
 
+\layout Standard
+
+\backslash 
+/
 \end_inset 
 
- option can sometimes be useful in locating optimization problems.
- When reporting a bug please maker sure you:
-\layout Enumerate
+-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
 
-Attach the code you are compiling with SDCC.
-\layout Enumerate
+The compiler outputs the higher order address byte of the external ram segment
+ into PORT P2, therefore when using the External Stack option, this port
+ MAY NOT be used by the application program.
+\layout Subsection
 
-Specify the exact command you use to run SDCC, or attach your Makefile.
-\layout Enumerate
+ANSI-Compliance
+\begin_inset LatexCommand \index{ANSI-compliance}
 
-Specify the SDCC version (type "sdcc -v"), your platform, and operating
- system.
-\layout Enumerate
+\end_inset 
 
-Provide an exact copy of any error message or incorrect output.
-\layout Enumerate
 
-Put something meaningful in the subject of your message.
 \layout Standard
 
-Please attempt to include these 5 important parts, as applicable, in all
- requests for support or when reporting any problems or bugs with SDCC.
- Though this will make your message lengthy, it will greatly improve your
- chance that SDCC users and developers will be able to help you.
- Some SDCC developers are frustrated by bug reports without code provided
- that they can use to reproduce and ultimately fix the problem, so please
- be sure to provide sample code if you are reporting a bug! 
-\layout Standard
+Deviations from the compliance:
+\layout Itemize
 
-Please have a short check that you are using a recent version of SDCC and
- the bug is not yet known.
- This is the link for reporting bugs: 
-\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599}
+functions are not always reentrant.
+\layout Itemize
 
-\end_inset 
+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, e.g.:
+\begin_deeper 
+\layout Verse
 
-.
-\layout Subsection
 
-Requesting Features
-\begin_inset LatexCommand \index{Feature request}
+\family typewriter 
+struct s { ...
+ }; 
+\newline 
+struct s s1, s2; 
+\newline 
+foo() 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+\newline 
+}
+\newline 
+struct s foo1 (struct s parms) /* invalid in SDCC although allowed in ANSI
+ */
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+struct s rets; 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return rets;/* is invalid in SDCC although allowed in ANSI */ 
+\newline 
+}
+\end_deeper 
+\layout Itemize
 
-\end_inset 
+'long long
+\begin_inset LatexCommand \index{long long (not supported)}
 
+\end_inset 
 
-\begin_inset LatexCommand \index{Requesting features}
+' (64 bit integers
+\begin_inset LatexCommand \index{int (64 bit) (not supported)}
 
 \end_inset 
 
+) not supported.
+\layout Itemize
 
-\layout Standard
+'double
+\begin_inset LatexCommand \index{double (not supported)}
 
-Like bug reports feature requests are forwarded to the developer mailing
- list.
- This is the link for requesting features: 
-\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
+\end_inset 
+
+' precision floating point 
+\begin_inset LatexCommand \index{Floating point support}
 
 \end_inset 
 
-.
-\layout Subsection
+not supported.
+\layout Itemize
 
-Getting Help
-\layout Standard
+No support for setjmp and longjmp (for now).
+\layout Itemize
 
-These links should take you directly to the 
-\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599}
+Old K&R style
+\begin_inset LatexCommand \index{K\&R style}
 
 \end_inset 
 
+ function declarations are NOT allowed.
+\begin_deeper 
+\layout Verse
 
-\begin_inset Foot
-collapsed false
-
-\layout Standard
 
-Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting
- automated messages (mid 2003)
-\end_inset 
+\family typewriter 
+foo(i,j) /* this old style of function declarations */ 
+\newline 
+int i,j; /* are valid in ANSI but not valid in SDCC */ 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+...
+\newline 
+}
+\end_deeper 
+\layout Itemize
 
- and the 
-\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599}
+functions declared as pointers must be dereferenced during the call.
+\begin_deeper 
+\layout Verse
 
-\end_inset 
 
-, lists and forums are archived so if you are lucky someone already had
- a similar problem.
+\family typewriter 
+int (*foo)();
+\newline 
+...
+\newline 
+/* has to be called like this */ 
+\newline 
+(*foo)(); /* ANSI standard allows calls to be made like 'foo()' */
+\end_deeper 
 \layout Subsection
 
-ChangeLog
-\begin_inset LatexCommand \index{Changelog}
+Cyclomatic Complexity
+\begin_inset LatexCommand \index{Cyclomatic complexity}
 
 \end_inset 
 
 
 \layout Standard
 
-You can follow the status of the cvs version
-\begin_inset LatexCommand \index{version}
+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.
+ 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.
+\newline 
 
-\end_inset 
+\newline 
+SDCC uses the following formula to compute the complexity:
+\newline 
 
- of SDCC by watching the file 
-\begin_inset LatexCommand \htmlurl[ChangeLog]{http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/sdcc/sdcc/ChangeLog?rev=HEAD&content-type=text/plain}
+\layout Standard
 
-\end_inset 
+complexity = (number of edges in control flow graph) - (number of nodes
+ in control flow graph) + 2;
+\newline 
 
- in the cvs-repository.
+\newline 
+Having said that the industry standard is 10, you should be aware that in
+ some cases it be 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 Subsection
 
-Release policy
-\begin_inset LatexCommand \index{Release policy}
-
-\end_inset 
-
+Other Processors
+\layout Subsubsection
 
+The Z80 and gbz80 port
 \layout Standard
 
-Historically there often were long delays between official releases and
- the sourceforge download area tends to get not updated at all.
- Current excuses might refer to problems with live range analysis, but if
- this is fixed, the next problem rising is that another excuse will have
- to be found.
- Kidding aside, we have to get better there! On the other hand there are
- daily snapshots available at 
-\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php}
+SDCC can target both the Zilog 
+\begin_inset LatexCommand \index{Z80}
 
 \end_inset 
 
-, and you can always built the very last version (hopefully with many bugs
- fixed, and features added) from the source code available at 
-\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source}
+ and the Nintendo Gameboy's Z80-like gbz80
+\begin_inset LatexCommand \index{GameBoy Z80}
 
 \end_inset 
 
 .
-\layout Subsection
-
-Examples
-\begin_inset LatexCommand \index{Examples}
+ The Z80 port is passed through the same 
+\emph on 
+regressions tests
+\begin_inset LatexCommand \index{Regression test}
 
 \end_inset 
 
 
+\emph default 
+ as MCS51 and DS390 ports, so floating point support, support for long variables
+ and bitfield support is fine.
 \layout Standard
 
-You'll find some small examples in the directory sdcc/device/examples/
-\layout Comment
-
-Maybe we should include some links to real world applications.
- Preferably pointer to pointers (one for each architecture) so this stays
- manageable here?
+As always, the code is the authoritative 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 variables.
+ IY is currently unused.
+ Return values are stored in HL.
+ One bad side effect of using IX as the base pointer is that a functions
+ stack frame is limited to 127 bytes - this will be fixed in a later version.
 \layout Subsection
 
-Quality control
-\begin_inset LatexCommand \index{Quality control}
+Retargetting for other MCUs.
+\layout Standard
 
-\end_inset 
+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 Itemize
+
+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 Itemize
 
+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 -
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-The compiler is passed through nightly compile and build checks.
- The so called 
-\shape italic 
-regression tests
-\shape default 
+\backslash 
+/
+\end_inset 
 
-\begin_inset LatexCommand \index{Regression test}
+-dumpraw option.
+\layout Itemize
 
-\end_inset 
+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:
+\newline 
 
- check that SDCC itself compiles flawlessly on several platforms and checks
- the quality of the code generated by SDCC by running the code through simulator
+\newline 
+Break down intermediate code (iCode) into basic blocks.
+\newline 
+Do control flow & data flow analysis on the basic blocks.
+\newline 
+Do local common subexpression elimination, then global subexpression elimination
+\newline 
+Dead code elimination
+\newline 
+Loop optimizations
+\newline 
+If loop optimizations caused any changes then do 'global subexpression eliminati
+on' and 'dead code elimination' again.
+\layout Itemize
+
+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.
- There is a separate document 
-\shape italic 
-test_suite.pdf
-\begin_inset LatexCommand \index{Test suite}
+ Live range analysis
+\begin_inset LatexCommand \index{Live range analysis}
 
 \end_inset 
 
+ is essential for register allocation, since these computation determines
+ which of these iTemps will be assigned to registers, and for how long.
+\layout Itemize
 
-\shape default 
- about this.
-\layout Standard
-
-You'll find the test code in the directory 
-\shape italic 
-sdcc/support/regression
-\shape default 
-.
- You can run these tests manually by running 
-\family sans 
-make
-\family default 
- in this directory (or f.e.
-\family sans 
-make test-mcs51
-\family default 
- if you don't want to run the complete tests).
- The test code might also be interesting if you want to look for examples
-\begin_inset LatexCommand \index{Examples}
-
-\end_inset 
+Phase five is register allocation.
+ There are two parts to this process.
+\newline 
 
- checking corner cases of SDCC or if you plan to submit patches
-\begin_inset LatexCommand \index{Patch submission}
+\newline 
+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.
+\newline 
 
-\end_inset 
+\newline 
+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.
+\layout Itemize
 
-.
-\layout Standard
+The Code generation phase is (unhappily), entirely MCU dependent and very
+ little (if any at all) of this code can be reused for other MCU.
+ However the scheme for allocating a homogenized assembler operand for each
+ iCode operand may be reused.
+\layout Itemize
 
-The pic port uses a different set of regression tests, you'll find them
- in the directory 
-\shape italic 
-sdcc/src/regression
-\shape default 
-.
+As mentioned in the optimization section the peep-hole optimizer is rule
+ based system, which can reprogrammed for other MCUs.
 \layout Section
 \pagebreak_top 
 Compiler internals