* device/lib/mcs51/crtcall.asm: new, added for indirect calls
[fw/sdcc] / doc / sdccman.lyx
index 8aba420659abb1241207cf4314a8321199b25141..2972e85fc97895efe16a89afbc8ec9eefb710431 100644 (file)
@@ -7,7 +7,7 @@
   pdftitle={SDCC Compiler User Guide},
   pdfauthor={SDCC development team},
   pdfsubject={installation, user manual},
-  pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390                 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog},
+  pdfkeywords={68hc08 8032 8051 ansi c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Zilog},
   pdfpagemode=UseOutlines,
   colorlinks=true,
   linkcolor=blue] {hyperref}
 \papersides 1
 \paperpagestyle fancy
 
-\layout Comment
+\layout Standard
+
+
+\begin_inset Note
+collapsed true
+
+\layout Standard
 
 Please note: double dashed longoptions (e.g.
  --version) are written this way: -
@@ -59,22 +65,25 @@ status Collapsed
 \end_inset 
 
 -
-\layout Comment
+\layout Standard
 
 Two resp.
  three consecutive dashes simply result in a long resp.
  extra long dash.
-\layout Comment
+\layout Standard
 
 Architecture specific stuff (like memory models, code examples) should maybe
  later go
-\layout Comment
+\layout Standard
 
 into seperate sections/chapters/appendices (it is hard to document PIC or
  Z80 in 
-\layout Comment
+\layout Standard
 
 a 8051 centered document) - for now simply add.
+\end_inset 
+
+
 \layout Title
 
 SDCC Compiler User Guide
@@ -82,16 +91,25 @@ SDCC Compiler User Guide
 
 
 \size normal 
-SDCC 2.6.2
+SDCC 2.6.4
 \size footnotesize 
 
 \newline 
 $Date$ 
 \newline 
 $Revision$
-\layout Comment
+\layout Standard
+
+
+\begin_inset Note
+collapsed true
+
+\layout Standard
 
 The above strings enclosed in $ are automatically updated by Subversion
+\end_inset 
+
+
 \layout Standard
 
 
@@ -1059,6 +1077,20 @@ status Collapsed
 \end_inset 
 
 -datadir see table below
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-datarootdir see table below
 \newline 
 
 \layout List
@@ -1351,7 +1383,7 @@ These defaults are:
 \align center 
 
 \begin_inset  Tabular
-<lyxtabular version="3" rows="8" columns="3">
+<lyxtabular version="3" rows="9" columns="3">
 <features>
 <column alignment="block" valignment="top" leftline="true" width="0in">
 <column alignment="block" valignment="top" leftline="true" width="0in">
@@ -1462,7 +1494,7 @@ BINDIR
 
 
 \emph on 
-$EXECPREFIX
+$EXEC_PREFIX
 \emph default 
 /bin
 \end_inset 
@@ -1474,7 +1506,7 @@ $EXECPREFIX
 
 
 \emph on 
-$EXECPREFIX
+$EXEC_PREFIX
 \emph default 
 
 \backslash 
@@ -1499,6 +1531,38 @@ DATADIR
 \layout Standard
 
 
+\emph on 
+$DATAROOTDIR
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\emph on 
+$DATAROOTDIR
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\emph on 
+DATAROOTDIR
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
 \emph on 
 $PREFIX
 \emph default 
@@ -1534,7 +1598,7 @@ DOCDIR
 
 
 \emph on 
-$DATADIR
+$DATAROOTDIR
 \emph default 
 /sdcc/doc
 \end_inset 
@@ -1546,7 +1610,7 @@ $DATADIR
 
 
 \emph on 
-$DATADIR
+$DATAROOTDIR
 \emph default 
 
 \backslash 
@@ -1784,7 +1848,7 @@ status Collapsed
 /
 \end_inset 
 
--datadir=
+-datarootdir=
 \begin_inset Quotes srd
 \end_inset 
 
@@ -1901,7 +1965,7 @@ status Collapsed
 /
 \end_inset 
 
--datadir=
+-datarootdir=
 \begin_inset Quotes srd
 \end_inset 
 
@@ -1917,7 +1981,9 @@ docdir=
 \begin_inset Quotes srd
 \end_inset 
 
-/sdcc/doc
+
+\backslash 
+${datarootdir}/doc
 \begin_inset Quotes srd
 \end_inset 
 
@@ -2058,7 +2124,7 @@ status Collapsed
 /
 \end_inset 
 
--datadir=
+-datarootdir=
 \begin_inset Quotes srd
 \end_inset 
 
@@ -2074,7 +2140,9 @@ docdir=
 \begin_inset Quotes srd
 \end_inset 
 
-/sdcc/doc
+
+\backslash 
+${datarootdir}/doc
 \begin_inset Quotes srd
 \end_inset 
 
@@ -2164,7 +2232,7 @@ status Collapsed
  However if options are changed, it can be necessary to delete the config.cache
  file.
 \layout Section
-
+\added_space_bottom medskip 
 Install paths
 \begin_inset LatexCommand \label{sub:Install-paths}
 
@@ -2177,7 +2245,7 @@ Install paths
 
 
 \layout Standard
-\added_space_top medskip \align center 
+\align center 
 
 \begin_inset  Tabular
 <lyxtabular version="3" rows="5" columns="4">
@@ -3267,10 +3335,19 @@ lib/
 
 \newline 
 
-\layout Comment
+\layout Standard
+
+
+\begin_inset Note
+collapsed true
+
+\layout Standard
 
 Don't delete any of the stray spaces in the table above without checking
  the HTML output (last line)!
+\end_inset 
+
+
 \layout Standard
 
 \SpecialChar ~
@@ -5846,11 +5923,20 @@ Processor Selection Options
 \end_inset 
 
 .
-\layout Comment
+\layout Standard
+
+
+\begin_inset Note
+collapsed true
+
+\layout Standard
 
 I think it is fair to direct users there for now.
  Open source is also about avoiding unnecessary work .
  But I didn't find the 'official' link.
+\end_inset 
+
+
 \layout List
 \labelwidthstring 00.00.0000
 
@@ -5870,9 +5956,18 @@ I think it is fair to direct users there for now.
 
 -bit processors (p16f84 and variants.
  In development, not complete).
-\layout Comment
+\layout Standard
+
+
+\begin_inset Note
+collapsed true
+
+\layout Standard
 
 p16f627 p16f628 p16f84 p16f873 p16f877?
+\end_inset 
+
+
 \layout List
 \labelwidthstring 00.00.0000
 
@@ -6122,6 +6217,33 @@ file"'.
 Like `-dD' except that the macro arguments and contents are omitted.
  Only `#define name' is included in the output.
 \layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold 
+-pedantic-parse-number
+\begin_inset LatexCommand \index{-pedantic-parse-number}
+
+\end_inset 
+
+
+\size large 
+\bar under 
+\series default 
+\size default 
+\bar default 
+Pedentic parse numbers so that situations like 0xfe-LO_B(3) are parsed properly
+ and the macro LO_B(3) gets expanded.
+ See also #pragma pedantic_parse_number in section
+\begin_inset LatexCommand \ref{sec:Pragmas}
+
+\end_inset 
+
+\emph on 
+Note: this functionality is not in conformance with standard!
+\layout List
 \added_space_bottom bigskip \labelwidthstring 00.00.0000
 
 
@@ -6164,7 +6286,7 @@ gcc
 \end_inset 
 
 ), if you need more dedicated options please refer to the GCC\SpecialChar ~
-3.3.6\SpecialChar ~
+4.1.1\SpecialChar ~
 CPP\SpecialChar ~
 Manual
  at 
@@ -8178,6 +8300,46 @@ status Collapsed
 \labelwidthstring 00.00.0000
 
 
+\series bold 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-funsigned-char
+\begin_inset LatexCommand \index{-\/-funsigned-char}
+
+\end_inset 
+
+
+\series default 
+ The default signedness for every type is
+\family typewriter 
+ signed
+\family default 
+.
+ In some embedded environments the default signedness of
+\family typewriter 
+ char
+\family default 
+ is
+\family typewriter 
+ unsigned
+\family default 
+.
+ To set the signess for characters to unsigned, use the option --funsigned-char.
+ If this option is set and no signedness keyword (unsigned/signed) is given,
+ a char will be signed.
+ All other types are unaffected.
+\layout List
+\labelwidthstring 00.00.0000
+
+
 \series bold 
 -
 \begin_inset ERT
@@ -8696,6 +8858,29 @@ status Collapsed
  Can be used for instance when using bank switching to put the const data
  in a bank.
 \layout List
+\labelwidthstring 00.00.0000
+
+
+\series bold 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-fdollars-in-identifiers
+\begin_inset LatexCommand \index{-\/-fdollars-in-identifiers}
+
+\end_inset 
+
+
+\series default 
+ Permit '$' as an identifier character
+\layout List
 \added_space_bottom bigskip \labelwidthstring 00.00.0000
 
 
@@ -10658,7 +10843,7 @@ portmode
 
 \end_inset 
 
-=z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio
+ z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio
 ns 
 \family typewriter 
 in0/out0
@@ -12927,232 +13112,95 @@ Startup Code
 MCS51/DS390 Startup Code
 \layout Standard
 
-The compiler inserts a call to the C routine 
-\emph on 
-_sdcc_external_startup()
-\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
+The compiler triggers the linker to link certain initialization modules
+ from the runtime library
+\begin_inset LatexCommand \index{Runtime library}
 
 \end_inset 
 
+ called crt<something>.
+ Only the necessary ones are linked, for instance crtxstack.asm (GSINIT1,
+ GSINIT5) is not linked unless the --xstack option is used.
+ These modules are highly entangled by the use of special segments/areas,
+ but a common layout is shown below:
+\layout Verse
+
 
+\family typewriter 
 \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}
+\size footnotesize 
+(main.asm)
+\layout Verse
 
-\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
-\begin_inset LatexCommand \index{Variable initialization}
+\family typewriter 
+\size footnotesize 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+.area HOME (CODE)
+\newline 
+__interrupt_vect:
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ljmp __sdcc_gsinit_startup
+\layout Verse
 
-\end_inset 
 
-.
- On some mcs51 variants xdata
-\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
+\family typewriter 
+\series bold 
+\size footnotesize 
+(crtstart.asm)
+\layout Verse
 
-\end_inset 
 
- memory has to be explicitly enabled before it can be accessed or if the
- watchdog
-\begin_inset LatexCommand \index{watchdog}
+\family typewriter 
+\size footnotesize 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+.area GSINIT0 (CODE)
+\newline 
+__sdcc_gsinit_startup::
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov sp,#__start__stack - 1
+\layout Verse
 
-\end_inset 
 
- needs to be disabled, this is the place to do it.
- The startup code clears all internal data memory, 256 bytes by default,
- but from 0 to n-1 if 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--iram-size
-\begin_inset LatexCommand \index{-\/-iram-size <Value>}
-
-\end_inset 
-
-n
-\emph default 
- is used.
- (recommended for Chipcon CC1010).
-\layout Standard
-\added_space_bottom bigskip 
-See also the compiler options 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--no-xinit
-\emph default 
--
-\emph on 
-opt
-\emph default 
-
-\begin_inset LatexCommand \index{-\/-no-xinit-opt}
-
-\end_inset 
-
-, 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--main-return
-\emph default 
-
-\begin_inset LatexCommand \index{-\/-main-return}
-
-\end_inset 
-
- and section 
-\begin_inset LatexCommand \ref{sub:MCS51-variants}
-
-\end_inset 
-
- about MCS51-variants.
-\layout Subsection
-
-HC08 Startup Code
-\layout Standard
-\added_space_bottom bigskip 
-The HC08
-\begin_inset LatexCommand \index{HC08}
-
-\end_inset 
-
- startup code follows the same scheme as the MCS51 startup code.
-\layout Subsection
-
-Z80 Startup Code
-\layout Standard
-\added_space_bottom bigskip 
-On the Z80
-\begin_inset LatexCommand \index{Z80}
-
-\end_inset 
-
- the startup code is inserted by linking with crt0.o which is generated from
- sdcc/device/lib/z80/crt0.s.
- If you need a different startup code you can use the compiler option 
-\emph on 
--
+\family typewriter 
 \series bold 
-\emph default 
-
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
-
-\series default 
-\emph on 
--no-std-crt0
-\emph default 
-
-\begin_inset LatexCommand \index{-\/-no-std-crt0}
-
-\end_inset 
-
- and provide your own crt0.o.
-\layout Section
-
-Inline Assembler Code
-\begin_inset LatexCommand \index{Assembler routines}
-
-\end_inset 
-
-
-\layout Subsection
-
-A Step by Step Introduction
-\begin_inset LatexCommand \label{sub:A-Step-by Assembler Introduction}
-
-\end_inset 
-
-
-\layout Standard
-
-Starting from a small snippet of c-code this example shows for the MCS51
- how to use inline assembly, access variables, a function parameter and
- an array in xdata memory.
- The example uses an MCS51 here but is easily adapted for other architectures.
- This is a buffer routine which should be optimized:
+\size footnotesize 
+(crtxstack.asm)
 \layout Verse
 
 
 \family typewriter 
 \size footnotesize 
-unsigned char __far
-\begin_inset LatexCommand \index{far (storage class)}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_far (storage class)}
-
-\end_inset 
-
- __at
-\begin_inset LatexCommand \index{at}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_at}
-
-\end_inset 
-
-(0x7f00) buf[0x100];
-\begin_inset LatexCommand \index{Aligned array}
-
-\end_inset 
-
-
-\newline 
-unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13161,6 +13209,13 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+.area GSINIT1 (CODE)
+\newline 
+__sdcc_init_xstack::
+\newline 
+; Need to initialize in GSINIT1 in case the user's __sdcc_external_startup
+ uses the xstack.
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13169,12 +13224,7 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* if interrupts
-\begin_inset LatexCommand \index{interrupt}
-
-\end_inset 
-
- are involved see
+mov __XPAGE,#(__start__xstack >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13184,6 +13234,19 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov _spx,#__start__xstack
+\layout Verse
+
+
+\family typewriter 
+\series bold 
+\size footnotesize 
+(crtstart.asm)
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13192,6 +13255,8 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+.area GSINIT2 (CODE)
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13200,6 +13265,8 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+lcall __sdcc_external_startup
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13208,6 +13275,8 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov a,dpl
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13216,61 +13285,31 @@ unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+jz __sdcc_init_data
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-section 
-\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
-
-\end_inset 
-
- about
-\series bold 
- volatile
-\series default 
- */
-\newline 
-
-\newline 
-void to_buffer( unsigned char c ) 
-\newline 
-{
-\newline 
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-if( head != (unsigned char)(tail-1) )\SpecialChar ~
-/* cast 
-\series bold 
-needed
-\series default 
- to avoid promotion
-\begin_inset LatexCommand \index{promotion to signed int}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{type promotion}
-
-\end_inset 
-
- to integer */
-\begin_inset Marginal
-collapsed true
-
-\layout Standard
+ljmp __sdcc_program_startup
+\newline 
+__sdcc_init_data:
+\layout Verse
 
 
+\family typewriter 
 \series bold 
-\SpecialChar ~
-!
-\end_inset 
+\size footnotesize 
+(crtxinit.asm)
+\layout Verse
 
 
-\newline 
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13279,7 +13318,11 @@ collapsed true
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-buf[ head++ ] = c;\SpecialChar ~
+.area GSINIT3 (CODE)
+\newline 
+__mcs51_genXINIT::
+\newline 
+\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13287,6 +13330,8 @@ buf[ head++ ] = c;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov r1,#l_XINIT
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13295,249 +13340,120 @@ buf[ head++ ] = c;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* access to a 256 byte aligned array */
-\newline 
-} 
-\layout Standard
-
-If the code snippet (assume it is saved in buffer.c) is compiled with SDCC
- then a corresponding buffer.asm file is generated.
- We define a new function 
-\family typewriter 
-to_buffer_asm()
-\family default 
- in file buffer.c in which we cut and paste the generated code, removing
- unwanted comments and some ':'.
- Then add 
-\begin_inset Quotes sld
-\end_inset 
-
-_asm
-\begin_inset Quotes srd
-\end_inset 
-
- and 
-\begin_inset Quotes sld
-\end_inset 
-
-_endasm;
-\begin_inset Quotes srd
-\end_inset 
-
- to the beginning and the end of the function body:
-\layout Verse
-
-
-\family typewriter 
-\size footnotesize 
-/* With a cut and paste from the .asm file, we have something to start with.
+mov a,r1
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-The function is not yet OK! (registers aren't saved) */ 
-\newline 
-void to_buffer_asm( unsigned char c ) 
-\newline 
-{ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm
-\begin_inset LatexCommand \index{\_asm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_asm}
-
-\end_inset 
-
-
+\SpecialChar ~
+orl a,#(l_XINIT >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-r2,dpl 
-\newline 
-;buffer.c if( head != (unsigned char)(tail-1) ) \SpecialChar ~
-/* cast 
-\series bold 
-needed
-\series default 
- to avoid promotion
-\begin_inset LatexCommand \index{promotion to signed int}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{type promotion}
-
-\end_inset 
-
- to integer */
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+jz 00003$
+\newline 
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-a,_tail 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dec\SpecialChar ~
 \SpecialChar ~
-a 
+\SpecialChar ~
+mov r2,#((l_XINIT+255) >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-r3,a 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov dptr,#s_XINIT
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-a,_head 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov r0,#s_XISEG
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-cjne a,ar3,00106$ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ret
+mov __XPAGE,#(s_XISEG >> 8)
 \newline 
-00106$: 
-\newline 
-;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */
-\begin_inset LatexCommand \index{Aligned array}
-
-\end_inset 
-
-
+00001$:\SpecialChar ~
+clr a
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
-r3,_head 
-\newline 
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-inc\SpecialChar ~
 \SpecialChar ~
-_head 
+movc a,@a+dptr
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-dpl,r3 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+movx @r0,a
+\newline 
+\SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-dph,#(_buf >> 8) 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
-a,r2 
+inc dptr
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-movx @dptr,a 
-\newline 
-00103$: 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ret
+inc r0
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_endasm}
-
-\end_inset 
-
-;
-\newline 
-} 
-\layout Standard
-
-The new file buffer.c should compile with only one warning about the unreferenced
- function argument 'c'.
- Now we hand-optimize the assembly code and insert an #define USE_ASSEMBLY
- (1) and finally have:
-\layout Verse
-
-
-\family typewriter 
-\size footnotesize 
-unsigned char __far __at(0x7f00) buf[0x100];
-\newline 
-unsigned char head, tail;
-\newline 
-#define USE_ASSEMBLY (1)
-\newline 
-
-\newline 
-#if !USE_ASSEMBLY
-\newline 
-
-\newline 
-void to_buffer( unsigned char c )
-\newline 
-{
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-if( head != (unsigned char)(tail-1) )
+cjne r0,#0,00002$
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13547,41 +13463,20 @@ if( head != (unsigned char)(tail-1) )
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-buf[ head++ ] = c;
-\newline 
-}
-\newline 
-
-\newline 
-#else
-\newline 
-
+inc __XPAGE
 \newline 
-void to_buffer( unsigned char c )
-\newline 
-{
+00002$:\SpecialChar ~
+djnz r1,00001$
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-c; // to avoid warning: unreferenced function argument
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm
-\begin_inset LatexCommand \index{\_asm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_asm}
-
-\end_inset 
-
-
+djnz r2,00001$
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13591,9 +13486,21 @@ _asm
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; save used registers here.
+mov __XPAGE,#0xFF
 \newline 
+00003$:
+\layout Verse
+
+
+\family typewriter 
+\series bold 
+\size footnotesize 
+(crtclear.asm)
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13602,10 +13509,9 @@ _asm
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; If we were still using r2,r3 we would have to push them here.
+.area GSINIT4 (CODE)
 \newline 
-; if( head != (unsigned char)(tail-1) )
+__mcs51_genRAMCLEAR::
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13615,8 +13521,7 @@ _asm
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
- a,_tail
+clr a
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13626,8 +13531,10 @@ mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dec\SpecialChar ~
- a
+mov r0,#(l_IRAM-1)
+\newline 
+00004$:\SpecialChar ~
+mov @r0,a
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13637,9 +13544,21 @@ dec\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-xrl\SpecialChar ~
- a,_head
+djnz r0,00004$
 \newline 
+; _mcs51_genRAMCLEAR() end
+\layout Verse
+
+
+\family typewriter 
+\series bold 
+\size footnotesize 
+(crtxclear.asm)
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -13648,7 +13567,9 @@ xrl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; we could do an ANL a,#0x0f here to use a smaller buffer (see below)
+.area GSINIT4 (CODE)
+\newline 
+__mcs51_genXRAMCLEAR::
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13658,9 +13579,7 @@ xrl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-jz\SpecialChar ~
-\SpecialChar ~
- t_b_end$
+mov r0,#l_PSEG
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13670,9 +13589,7 @@ jz\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-;
-\newline 
-; buf[ head++ ] = c;
+mov a,r0
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13682,29 +13599,27 @@ jz\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
- a,dpl \SpecialChar ~
+jz 00006$
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; dpl holds lower byte of function argument
-\newline 
 \SpecialChar ~
 \SpecialChar ~
+mov r1,#s_PSEG
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
- dpl,_head \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; buf is 0x100 byte aligned so head can be used directly
+mov __XPAGE,#(s_PSEG >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13714,8 +13629,10 @@ mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
- dph,#(_buf>>8)
+clr a
+\newline 
+00005$:\SpecialChar ~
+movx @r1,a
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13725,7 +13642,7 @@ mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-movx @dptr,a
+inc r1
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13735,8 +13652,9 @@ movx @dptr,a
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-inc \SpecialChar ~
-_head
+djnz r0,00005$
+\newline 
+00006$:
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13746,9 +13664,7 @@ _head
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; we could do an ANL _head,#0x0f here to use a smaller buffer (see above)
-\newline 
-t_b_end$:
+mov r0,#l_XSEG
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13758,239 +13674,37 @@ t_b_end$:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; restore used registers here 
+mov a,r0
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_endasm}
-
-\end_inset 
-
-;
-\newline 
-}
-\newline 
-#endif
-\layout Standard
-
-The inline assembler code can contain any valid code understood by the assembler
-, this includes any assembler directives and comment lines.
- The assembler does not like some characters like ':' or ''' in comments.
- You'll find an 100+ pages assembler manual in sdcc/as/doc/asxhtm.html
-\begin_inset LatexCommand \index{asXXXX (as-gbz80, as-hc08, asx8051, as-z80)}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{Assembler documentation}
-
-\end_inset 
-
- or online at 
-\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
-
-\end_inset 
-
 \SpecialChar ~
-.
-\layout Standard
-
-The compiler does not do any validation of the code within the 
-\family typewriter 
-_asm
-\begin_inset LatexCommand \index{\_asm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_asm}
-
-\end_inset 
-
- ...
- _endasm
-\size footnotesize 
-
-\begin_inset LatexCommand \index{\_endasm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_endasm}
-
-\end_inset 
-
-
-\size default 
-;
-\family default 
- keyword pair.
- Specifically it will not know which registers are used and thus register
- pushing/popping
-\begin_inset LatexCommand \index{push/pop}
-
-\end_inset 
-
- has to be done manually.
-\layout Standard
-
-It is recommended that each assembly instruction (including labels) be placed
- in a separate line (as the example shows).
- When the -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--
-\emph on 
-peep-asm
-\begin_inset LatexCommand \index{-\/-peep-asm}
-
-\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}
-
-\end_inset 
-
-.
- There are only a few (if any) cases where this option makes sense, it might
- cause some unexpected changes in the inline assembler code.
- Please go through the peephole optimizer rules defined in file 
-\emph on 
-SDCCpeeph.def
-\emph default 
- before using this option.
-\layout Subsection
-
-Naked Functions
-\begin_inset LatexCommand \label{sub:Naked-Functions}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{Naked functions}
-
-\end_inset 
-
-
-\layout Standard
-
-A special keyword may be associated with a function declaring it as 
-\emph on 
-_naked
-\begin_inset LatexCommand \index{\_naked}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_naked}
-
-\end_inset 
-
-.
-\emph default 
-The 
-\emph on 
-_naked
-\emph default 
- function modifier attribute prevents the compiler from generating prologue
-\begin_inset LatexCommand \index{function prologue}
-
-\end_inset 
-
- and epilogue
-\begin_inset LatexCommand \index{function epilogue}
-
-\end_inset 
-
- code for that function.
- This means that the user is entirely responsible for such things as saving
- any registers that may need to be preserved, selecting the proper register
- bank, generating the 
-\emph on 
-return
-\emph default 
- instruction at the end, etc.
- Practically, this means that the contents of the function must be written
- in inline assembler.
- This is particularly useful for interrupt functions, which can have a large
- (and often unnecessary) prologue/epilogue.
- For example, compare the code generated by these two functions:
-\layout Verse
-
-
-\family typewriter 
-volatile
-\begin_inset LatexCommand \index{volatile}
-
-\end_inset 
-
- data unsigned char counter;
-\newline 
-
-\newline 
-void simpleInterrupt(void) __interrupt
-\begin_inset LatexCommand \index{interrupt}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_interrupt}
-
-\end_inset 
-
- (1)
-\newline 
-{
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+orl a,#(l_XSEG >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-counter++;
-\newline 
-}
-\newline 
-
-\newline 
-void nakedInterrupt(void) __interrupt (2) __naked
-\newline 
-{
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+jz 00008$
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm
-\begin_inset LatexCommand \index{\_asm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_asm}
-
-\end_inset 
-
-
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov r1,#((l_XSEG + 255) >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -13998,12 +13712,22 @@ _asm
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-inc\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov dptr,#s_XSEG
+\newline 
 \SpecialChar ~
 \SpecialChar ~
-_counter ; does not change flags, no need to save psw
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+clr a
+\newline 
+00007$:\SpecialChar ~
+movx @dptr,a
 \newline 
 \SpecialChar ~
 \SpecialChar ~
@@ -14011,211 +13735,169 @@ _counter ; does not change flags, no need to save psw
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-reti\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+inc dptr
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; MUST explicitly include ret or reti in _naked function.
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+djnz r0,00007$
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_endasm}
-
-\end_inset 
-
-;
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+djnz r1,00007$
 \newline 
-}
-\layout Standard
-
-For an 8051 target, the generated simpleInterrupt looks like:
+00008$:
 \layout Verse
 
 
 \family typewriter 
-Note, this is an 
-\emph on 
-outdated
-\emph default 
- example, recent versions of SDCC generate
-\newline 
-the 
-\emph on 
-same
-\emph default 
- code for simpleInterrupt() and nakedInterrupt()!
-\newline 
+\series bold 
+\size footnotesize 
+(crtxstack.asm)
+\layout Verse
 
-\newline 
-_simpleInterrupt:
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-acc
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
-b
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-push\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dpl
+.area GSINIT5 (CODE)
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-dph
+; Need to initialize in GSINIT5 because __mcs51_genXINIT modifies __XPAGE
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-push\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-psw
+; and __mcs51_genRAMCLEAR modifies _spx.
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-psw,#0x00
+mov __XPAGE,#(__start__xstack >> 8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-inc\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_counter
-\newline 
+mov _spx,#__start__xstack
+\layout Verse
+
+
+\family typewriter 
+\series bold 
+\size footnotesize 
+(application modules)
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-psw
-\newline 
+.area GSINIT (CODE)
+\layout Verse
+
+
+\family typewriter 
+\series bold 
+\size footnotesize 
+(main.asm)
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dph
+.area GSFINAL (CODE)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dpl
+ljmp __sdcc_program_startup
+\newline 
+;--------------------------------------------------------
+\newline 
+; Home
+\newline 
+;--------------------------------------------------------
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-b
+.area HOME (CODE)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-acc
+.area CSEG (CODE)
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-reti
-\layout Standard
-
-whereas nakedInterrupt looks like:
-\layout Verse
-
-
-\family typewriter 
-_nakedInterrupt:
+__sdcc_program_startup:
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-inc\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-_counter ; does not change flags, no need to save psw
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
-reti\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+lcall _main
+\newline 
+; return from main will lock up
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -14224,2015 +13906,2242 @@ reti\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; MUST explicitly include ret or reti in _naked function
+sjmp .
 \layout Standard
 
-The related directive #pragma exclude
-\begin_inset LatexCommand \index{\#pragma exclude}
+One of these modules (crtstart.asm) contains a call to the C routine 
+\emph on 
+_sdcc_external_startup()
+\begin_inset LatexCommand \index{\_sdcc\_external\_startup()}
 
 \end_inset 
 
- allows a more fine grained control over pushing & popping
-\begin_inset LatexCommand \index{push/pop}
+
+\series bold 
+\emph default 
+\series default 
+at the start of the CODE area.
+ This routine is also in the runtime library
+\begin_inset LatexCommand \index{Runtime library}
 
 \end_inset 
 
- the registers.
-\layout Standard
+ and returns 0 by default.
+ If this routine returns a non-zero value, the static & global variable
+ initialization will be skipped and the function main will be invoked.
+ Otherwise static & global variables will be initialized before the function
+ main is invoked.
+ You could add an 
+\emph on 
+_sdcc_external_startup()
+\emph default 
+ routine to your program to override the default if you need to setup hardware
+ or perform some other critical operation prior to static & global variable
+ initialization
+\begin_inset LatexCommand \index{Variable initialization}
 
-While there is nothing preventing you from writing C code inside a 
-\family typewriter 
-_naked
-\family default 
- function, there are many ways to shoot yourself in the foot doing this,
- and it is recommended that you stick to inline assembler.
-\layout Subsection
+\end_inset 
 
-Use of Labels within Inline Assembler
-\layout Standard
+.
+ On some mcs51 variants xdata
+\begin_inset LatexCommand \index{xdata (mcs51, ds390 storage class)}
 
-SDCC allows the use of in-line assembler with a few restrictions regarding
- labels.
- In older versions of the compiler all labels defined within inline assembler
- code 
+\end_inset 
+
+ memory has to be explicitly enabled before it can be accessed or if the
+ watchdog
+\begin_inset LatexCommand \index{watchdog}
+
+\end_inset 
+
+ needs to be disabled, this is the place to do it.
+ The startup code clears all internal data memory, 256 bytes by default,
+ but from 0 to n-1 if 
 \emph on 
-had to be
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-iram-size
+\begin_inset LatexCommand \index{-\/-iram-size <Value>}
+
+\end_inset 
+
+n
 \emph default 
- of the form 
+ is used.
+ (recommended for Chipcon CC1010).
+\layout Standard
+\added_space_bottom bigskip 
+See also the compiler options 
 \emph on 
-nnnnn$
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-no-xinit
 \emph default 
- where nnnn is a number less than 100 (which implies a limit of utmost 100
- inline assembler labels 
+-
 \emph on 
-per function
+opt
 \emph default 
-\noun on 
-)
-\noun default 
-.
-\layout Verse
 
-
-\family typewriter 
-_asm
-\begin_inset LatexCommand \index{\_asm}
+\begin_inset LatexCommand \index{-\/-no-xinit-opt}
 
 \end_inset 
 
+, 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
-\begin_inset LatexCommand \index{\_\_asm}
+\layout Standard
 
+\backslash 
+/
 \end_inset 
 
+-main-return
+\emph default 
+
+\begin_inset LatexCommand \index{-\/-main-return}
+
+\end_inset 
+
+ and section 
+\begin_inset LatexCommand \ref{sub:MCS51-variants}
+
+\end_inset 
+
+ about MCS51-variants.
+\layout Subsection
+
+HC08 Startup Code
+\layout Standard
+\added_space_bottom bigskip 
+The HC08
+\begin_inset LatexCommand \index{HC08}
+
+\end_inset 
+
+ startup code follows the same scheme as the MCS51 startup code.
+\layout Subsection
+
+Z80 Startup Code
+\layout Standard
+\added_space_bottom bigskip 
+On the Z80
+\begin_inset LatexCommand \index{Z80}
+
+\end_inset 
+
+ the startup code is inserted by linking with crt0.o which is generated from
+ sdcc/device/lib/z80/crt0.s.
+ If you need a different startup code you can use the compiler option 
+\emph on 
+-
+\series bold 
+\emph default 
+
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+
+\series default 
+\emph on 
+-no-std-crt0
+\emph default 
+
+\begin_inset LatexCommand \index{-\/-no-std-crt0}
+
+\end_inset 
+
+ and provide your own crt0.o.
  
+\layout Section
+
+Inline Assembler Code
+\begin_inset LatexCommand \index{Assembler routines}
+
+\end_inset 
+
+
+\layout Subsection
+
+A Step by Step Introduction
+\begin_inset LatexCommand \label{sub:A-Step-by Assembler Introduction}
+
+\end_inset 
+
+
+\layout Standard
+
+Starting from a small snippet of c-code this example shows for the MCS51
+ how to use inline assembly, access variables, a function parameter and
+ an array in xdata memory.
+ The example uses an MCS51 here but is easily adapted for other architectures.
+ This is a buffer routine which should be optimized:
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
+unsigned char __far
+\begin_inset LatexCommand \index{far (storage class)}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{\_\_far (storage class)}
+
+\end_inset 
+
+ __at
+\begin_inset LatexCommand \index{at}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{\_\_at}
+
+\end_inset 
+
+(0x7f00) buf[0x100];
+\begin_inset LatexCommand \index{Aligned array}
+
+\end_inset 
+
+
 \newline 
+unsigned char head, tail;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-b,#10 
-\newline 
-00001$: 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-djnz\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-b,00001$ 
-\newline 
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{\_\_endasm}
-
-\end_inset 
-
- ;
-\layout Standard
-
-Inline assembler code cannot reference any C-Labels, however it can reference
- labels
-\begin_inset LatexCommand \index{Labels}
+\SpecialChar ~
+/* if interrupts
+\begin_inset LatexCommand \index{interrupt}
 
 \end_inset 
 
- defined by the inline assembler, e.g.:
-\layout Verse
-
-
-\family typewriter 
-foo() { 
+ are involved see
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* some c code */ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-; some assembler code 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ljmp $0003 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* some more c code */ 
-\newline 
-clabel:\SpecialChar ~
 \SpecialChar ~
-/* inline assembler cannot reference this label */ 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_asm
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-$0003: ;label (can be referenced by inline assembler only) 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-_endasm
-\begin_inset LatexCommand \index{\_endasm}
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+section 
+\begin_inset LatexCommand \ref{sub:Common-interrupt-pitfall-volatile}
 
 \end_inset 
 
+ about
+\series bold 
+ volatile
+\series default 
+ */
+\newline 
 
-\begin_inset LatexCommand \index{\_\_endasm}
-
-\end_inset 
-
- ; 
+\newline 
+void to_buffer( unsigned char c ) 
+\newline 
+{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* some more c code */
-\newline 
-}
-\layout Standard
-
-In other words inline assembly code can access labels defined in inline
- assembly within the scope of the function.
- The same goes the other way, i.e.
- labels defines in inline assembly can not be accessed by C statements.
-\layout Section
-
-Interfacing with Assembler Code
-\begin_inset LatexCommand \index{Assembler routines}
+if( head != (unsigned char)(tail-1) )\SpecialChar ~
+/* cast 
+\series bold 
+needed
+\series default 
+ to avoid promotion
+\begin_inset LatexCommand \index{promotion to signed int}
 
 \end_inset 
 
 
-\layout Subsection
-
-Global Registers used for Parameter Passing
-\begin_inset LatexCommand \index{Parameter passing}
+\begin_inset LatexCommand \index{type promotion}
 
 \end_inset 
 
+ to integer */
+\begin_inset Marginal
+collapsed true
 
 \layout Standard
 
-The compiler always uses the global registers 
-\emph on 
-DPL, DPH
-\begin_inset LatexCommand \index{DPTR, DPH, DPL}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{DPTR}
-
-\end_inset 
-
-, B
-\begin_inset LatexCommand \index{B (mcs51, ds390 register)}
-
-\end_inset 
-
-\emph default 
-and
-\emph on 
- ACC
-\begin_inset LatexCommand \index{ACC (mcs51, ds390 register)}
 
+\series bold 
+\SpecialChar ~
+!
 \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 Subsection
-
-Assembler Routine (non-reentrant)
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+buf[ head++ ] = c;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* access to a 256 byte aligned array */
+\newline 
+} 
 \layout Standard
 
-In the following example
-\begin_inset LatexCommand \index{reentrant}
-
+If the code snippet (assume it is saved in buffer.c) is compiled with SDCC
+ then a corresponding buffer.asm file is generated.
+ We define a new function 
+\family typewriter 
+to_buffer_asm()
+\family default 
+ in file buffer.c in which we cut and paste the generated code, removing
+ unwanted comments and some ':'.
+ Then add 
+\begin_inset Quotes sld
 \end_inset 
 
-
-\begin_inset LatexCommand \index{Assembler routines (non-reentrant)}
-
+_asm
+\begin_inset Quotes srd
 \end_inset 
 
- the function c_func calls an assembler routine asm_func, which takes two
- parameters
-\begin_inset LatexCommand \index{function parameter}
+ and 
+\begin_inset Quotes sld
+\end_inset 
 
+_endasm;
+\begin_inset Quotes srd
 \end_inset 
 
-.
+ to the beginning and the end of the function body:
 \layout Verse
 
 
 \family typewriter 
-extern int asm_func(unsigned char, unsigned char);
+\size footnotesize 
+/* With a cut and paste from the .asm file, we have something to start with.
 \newline 
-
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+The function is not yet OK! (registers aren't saved) */ 
 \newline 
-int c_func (unsigned char i, unsigned char j)
+void to_buffer_asm( unsigned char c ) 
 \newline 
-{
+{ 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return asm_func(i,j);
-\newline 
-}
-\newline 
+_asm
+\begin_inset LatexCommand \index{\_asm}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{\_\_asm}
+
+\end_inset 
+
 
-\newline 
-int main()
-\newline 
-{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return c_func(10,9);
+mov\SpecialChar ~
+\SpecialChar ~
+r2,dpl 
 \newline 
-}
-\layout Standard
+;buffer.c if( head != (unsigned char)(tail-1) ) \SpecialChar ~
+/* cast 
+\series bold 
+needed
+\series default 
+ to avoid promotion
+\begin_inset LatexCommand \index{promotion to signed int}
 
-The corresponding assembler function is:
-\layout Verse
+\end_inset 
 
 
-\family typewriter 
-.globl _asm_func_PARM_2 
+\begin_inset LatexCommand \index{type promotion}
+
+\end_inset 
+
+ to integer */
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
 \SpecialChar ~
+a,_tail 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-.globl _asm_func 
-\newline 
-\SpecialChar ~
 \SpecialChar ~
+dec\SpecialChar ~
 \SpecialChar ~
+a 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
 \SpecialChar ~
-.area OSEG 
-\newline 
-_asm_func_PARM_2:
+r3,a 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+a,_head 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-.ds    1 
+cjne a,ar3,00106$ 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ret
+\newline 
+00106$: 
+\newline 
+;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */
+\begin_inset LatexCommand \index{Aligned array}
+
+\end_inset 
+
+
+\newline 
+\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
 \SpecialChar ~
-.area CSEG 
-\newline 
-_asm_func: 
+r3,_head 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+inc\SpecialChar ~
 \SpecialChar ~
+_head 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
 \SpecialChar ~
-a,dpl 
+dpl,r3 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
 \SpecialChar ~
+dph,#(_buf >> 8) 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
+mov\SpecialChar ~
 \SpecialChar ~
-a,_asm_func_PARM_
+a,r
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+movx @dptr,a 
+\newline 
+00103$: 
+\newline 
+\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ret
+\newline 
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dpl,a 
+_endasm
+\begin_inset LatexCommand \index{\_endasm}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{\_\_endasm}
+
+\end_inset 
+
+;
+\newline 
+} 
+\layout Standard
+
+The new file buffer.c should compile with only one warning about the unreferenced
+ function argument 'c'.
+ Now we hand-optimize the assembly code and insert an #define USE_ASSEMBLY
+ (1) and finally have:
+\layout Verse
+
+
+\family typewriter 
+\size footnotesize 
+unsigned char __far __at(0x7f00) buf[0x100];
+\newline 
+unsigned char head, tail;
+\newline 
+#define USE_ASSEMBLY (1)
+\newline 
+
+\newline 
+#if !USE_ASSEMBLY
+\newline 
+
+\newline 
+void to_buffer( unsigned char c )
+\newline 
+{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+if( head != (unsigned char)(tail-1) )
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-dph
-\begin_inset LatexCommand \index{DPTR, DPH, DPL}
+\SpecialChar ~
+buf[ head++ ] = c;
+\newline 
+}
+\newline 
 
-\end_inset 
+\newline 
+#else
+\newline 
 
-,#0x00 
+\newline 
+void to_buffer( unsigned char c )
+\newline 
+{
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+c; // to avoid warning: unreferenced function argument
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ret
-\layout Standard
+_asm
+\begin_inset LatexCommand \index{\_asm}
 
-Note here that the return values
-\begin_inset LatexCommand \index{return value}
+\end_inset 
+
+
+\begin_inset LatexCommand \index{\_\_asm}
 
 \end_inset 
 
- 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 a one byte parameter, 
-\begin_inset Quotes eld
-\end_inset 
-
-dptr
-\begin_inset Quotes erd
-\end_inset 
-
- for 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 a four bytes parameter.
- The variable name for the second parameter will be _<function_name>_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 Subsection
-
-Assembler Routine (reentrant)
-\layout Standard
-
-In this case
-\begin_inset LatexCommand \index{reentrant}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{Assembler routines (reentrant)}
-
-\end_inset 
-
- the second parameter
-\begin_inset LatexCommand \index{function parameter}
-
-\end_inset 
-
- onwards will be passed on the stack, the parameters are pushed from right
- to left i.e.
- after the call the leftmost parameter will be on the top of the stack.
- Here is an example:
-\layout Verse
-
-
-\family typewriter 
-extern int asm_func(unsigned char, unsigned char);
 \newline 
-
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; save used registers here.
 \newline 
-int c_func (unsigned char i, unsigned char j) reentrant 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; If we were still using r2,r3 we would have to push them here.
 \newline 
-{ 
+; if( head != (unsigned char)(tail-1) )
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return asm_func(i,j); 
-\newline 
-} 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+ a,_tail
 \newline 
-
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dec\SpecialChar ~
+ a
 \newline 
-int main() 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+xrl\SpecialChar ~
+ a,_head
 \newline 
-{ 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; we could do an ANL a,#0x0f here to use a smaller buffer (see below)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-return c_func(10,9); 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+jz\SpecialChar ~
+\SpecialChar ~
+ t_b_end$
 \newline 
-}
-\layout Standard
-
-The corresponding assembler routine is:
-\layout Verse
-
-
-\family typewriter 
-.globl _asm_func 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+;
 \newline 
-_asm_func: 
+; buf[ head++ ] = c;
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-push  _bp 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov _bp,sp 
-\newline 
+mov\SpecialChar ~
+ a,dpl \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov r2,dpl
+\SpecialChar ~
+\SpecialChar ~
+; dpl holds lower byte of function argument
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov a,_bp 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add a,#0xfd 
+mov\SpecialChar ~
+ dpl,_head \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; buf is 0x100 byte aligned so head can be used directly
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov r0,a 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add  a,#0xfc ;?
+mov\SpecialChar ~
+ dph,#(_buf>>8)
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  r1,a 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  a,@r0 
+movx @dptr,a
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-add  a,r2 ;?
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  dpl,a 
+inc \SpecialChar ~
+_head
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  dph,#0x00 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-mov  sp,_bp 
+; we could do an ANL _head,#0x0f here to use a smaller buffer (see above)
+\newline 
+t_b_end$:
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-pop  _bp 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; restore used registers here 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ret
-\layout Standard
-\added_space_bottom bigskip 
-The compiling and linking procedure remains the same, however note the extra
- entry & exit linkage required for the assembler code, _bp is the stack
- frame pointer and is used to compute the offset into the stack for parameters
- and local variables.
-\layout Section
-
-int (16 bit)
-\begin_inset LatexCommand \index{int (16 bit)}
+_endasm
+\begin_inset LatexCommand \index{\_endasm}
 
 \end_inset 
 
- and long (32 bit)
-\begin_inset LatexCommand \index{long (32 bit)}
+
+\begin_inset LatexCommand \index{\_\_endasm}
 
 \end_inset 
 
- Support
-\layout Standard
-
-For signed & unsigned int (16 bit) and long (32 bit) variables, division,
- multiplication and modulus operations are implemented by support routines.
- These support routines are all developed in ANSI-C to facilitate porting
- to other MCUs, although some model specific assembler optimizations are
- used.
- The following files contain the described routines, all of them can be
- found in <installdir>/share/sdcc/lib.
-\newline 
-
-\layout Standard
-\align center 
-
-\begin_inset  Tabular
-<lyxtabular version="3" rows="11" columns="2">
-<features>
-<column alignment="left" valignment="top" leftline="true" width="0">
-<column alignment="left" 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
-
+;
+\newline 
+}
+\newline 
+#endif
 \layout Standard
 
+The inline assembler code can contain any valid code understood by the assembler
+, this includes any assembler directives and comment lines.
+ The assembler does not like some characters like ':' or ''' in comments.
+ You'll find an 100+ pages assembler manual in sdcc/as/doc/asxhtm.html
+\begin_inset LatexCommand \index{asXXXX (as-gbz80, as-hc08, asx8051, as-z80)}
 
-\series bold 
-Function
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{Assembler documentation}
 
-\series bold 
-Description
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ or online at 
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
 
-_mulint.c 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+\SpecialChar ~
+.
 \layout Standard
 
-16 bit multiplication
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
+The compiler does not do any validation of the code within the 
+\family typewriter 
+_asm
+\begin_inset LatexCommand \index{\_asm}
 
-_divsint.c 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
- signed 16 bit division (calls _divuint)
+\begin_inset LatexCommand \index{\_\_asm}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ ...
+ _endasm
+\size footnotesize 
+
+\begin_inset LatexCommand \index{\_endasm}
 
-_divuint.c 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
- unsigned 16 bit division
+\begin_inset LatexCommand \index{\_\_endasm}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-_modsint.c
+\size default 
+;
+\family default 
+ keyword pair.
+ Specifically it will not know which registers are used and thus register
+ pushing/popping
+\begin_inset LatexCommand \index{push/pop}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+ has to be done manually.
 \layout Standard
 
-signed 16 bit modulus (calls _moduint)
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+It is recommended that each assembly instruction (including labels) be placed
+ in a separate line (as the example shows).
+ When the -
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-_moduint.c
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-
+\emph on 
+peep-asm
+\begin_inset LatexCommand \index{-\/-peep-asm}
 
-unsigned 16 bit modulus
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-_mullong.c
+\emph default 
+ command line option is used, the inline assembler code will be passed through
+ the peephole optimizer
+\begin_inset LatexCommand \index{Peephole optimizer}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+ There are only a few (if any) cases where this option makes sense, it might
+ cause some unexpected changes in the inline assembler code.
+ Please go through the peephole optimizer rules defined in file 
+\emph on 
+SDCCpeeph.def
+\emph default 
+ before using this option.
+\layout Subsection
+
+Naked Functions
+\begin_inset LatexCommand \label{sub:Naked-Functions}
 
-32 bit multiplication
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-_divslong.c 
+\begin_inset LatexCommand \index{Naked functions}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
 
 \layout Standard
 
- signed 32 division (calls _divulong)
+A special keyword may be associated with a function declaring it as 
+\emph on 
+_naked
+\begin_inset LatexCommand \index{\_naked}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-_divulong.c 
+\begin_inset LatexCommand \index{\_\_naked}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+\emph default 
+The 
+\emph on 
+_naked
+\emph default 
+ function modifier attribute prevents the compiler from generating prologue
+\begin_inset LatexCommand \index{function prologue}
 
-unsigned 32 division
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ and epilogue
+\begin_inset LatexCommand \index{function epilogue}
 
-_modslong.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ code for that function.
+ This means that the user is entirely responsible for such things as saving
+ any registers that may need to be preserved, selecting the proper register
+ bank, generating the 
+\emph on 
+return
+\emph default 
+ instruction at the end, etc.
+ Practically, this means that the contents of the function must be written
+ in inline assembler.
+ This is particularly useful for interrupt functions, which can have a large
+ (and often unnecessary) prologue/epilogue.
+ For example, compare the code generated by these two functions:
+\layout Verse
 
- signed 32 bit modulus (calls _modulong)
-\end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\family typewriter 
+volatile
+\begin_inset LatexCommand \index{volatile}
 
-_modulong.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ data unsigned char counter;
+\newline 
 
-unsigned 32 bit modulus
-\end_inset 
-</cell>
-</row>
-</lyxtabular>
+\newline 
+void simpleInterrupt(void) __interrupt
+\begin_inset LatexCommand \index{interrupt}
 
 \end_inset 
 
 
-\newline 
-
-\layout Standard
-
-Since they are compiled as 
-\emph on 
-non-reentrant
-\emph default 
-
-\begin_inset LatexCommand \index{reentrant}
-
-\end_inset 
-
-, interrupt
-\begin_inset LatexCommand \index{interrupt}
-
-\end_inset 
-
- service routines should not do any of the above operations.
- If this is unavoidable then the above routines will need to be compiled
- with the 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
-
-\end_inset 
-
-
-\emph default 
- option, after which the source program will have to be compiled with 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--int-long-reent
-\begin_inset LatexCommand \index{-\/-int-long-reent}
-
-\end_inset 
-
-
-\emph default 
- option.
- Notice that you don't have to call these routines directly.
- The compiler will use them automatically every time an integer operation
- is required.
-\layout Section
-
-Floating Point Support
-\begin_inset LatexCommand \index{Floating point support}
+\begin_inset LatexCommand \index{\_\_interrupt}
 
 \end_inset 
 
-
-\layout Standard
-
-SDCC supports IEEE (single precision 4 bytes) floating point numbers.
- The floating point support routines are derived from gcc's floatlib.c and
- consist of the following routines:
+ (1)
+\newline 
+{
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+counter++;
+\newline 
+}
 \newline 
 
-\layout Standard
-\align center 
-
-\size footnotesize 
-
-\begin_inset  Tabular
-<lyxtabular version="3" rows="17" columns="2">
-<features>
-<column alignment="left" valignment="top" leftline="true" width="0">
-<column alignment="left" 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
-
-
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-Function 
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
+\newline 
+void nakedInterrupt(void) __interrupt (2) __naked
+\newline 
+{
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_asm
+\begin_inset LatexCommand \index{\_asm}
 
-Description
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{\_\_asm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fsadd.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+inc\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_counter ; does not change flags, no need to save psw
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+reti\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; MUST explicitly include ret or reti in _naked function.
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_endasm
+\begin_inset LatexCommand \index{\_endasm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-add floating point numbers
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{\_\_endasm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fssub.c 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+;
+\newline 
+}
 \layout Standard
 
-
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-subtract floating point numbers 
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
+For an 8051 target, the generated simpleInterrupt looks like:
+\layout Verse
 
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fsdiv.c 
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
-
-
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-divide floating point numbers 
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\family typewriter 
+Note, this is an 
+\emph on 
+outdated
+\emph default 
+ example, recent versions of SDCC generate
+\newline 
+the 
+\emph on 
+same
+\emph default 
+ code for simpleInterrupt() and nakedInterrupt()!
+\newline 
 
+\newline 
+_simpleInterrupt:
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+acc
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+b
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dpl
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dph
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+psw
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+psw,#0x00
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+inc\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_counter
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+psw
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dph
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dpl
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+b
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+acc
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+reti
 \layout Standard
 
+whereas nakedInterrupt looks like:
+\layout Verse
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fsmul.c 
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+\family typewriter 
+_nakedInterrupt:
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+inc\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_counter ; does not change flags, no need to save psw
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+reti\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; MUST explicitly include ret or reti in _naked function
 \layout Standard
 
+The related directive #pragma exclude
+\begin_inset LatexCommand \index{\#pragma exclude}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-multiply floating point numbers 
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+ allows a more fine grained control over pushing & popping
+\begin_inset LatexCommand \index{push/pop}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fs2uchar.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+ the registers.
 \layout Standard
 
+While there is nothing preventing you from writing C code inside a 
+\family typewriter 
+_naked
+\family default 
+ function, there are many ways to shoot yourself in the foot doing this,
+ and it is recommended that you stick to inline assembler.
+\layout Subsection
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert floating point to unsigned char
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
+Use of Labels within Inline Assembler
 \layout Standard
 
+SDCC allows the use of in-line assembler with a few restrictions regarding
+ labels.
+ In older versions of the compiler all labels defined within inline assembler
+ code 
+\emph on 
+had to be
+\emph default 
+ of the form 
+\emph on 
+nnnnn$
+\emph default 
+ where nnnn is a number less than 100 (which implies a limit of utmost 100
+ inline assembler labels 
+\emph on 
+per function
+\emph default 
+\noun on 
+)
+\noun default 
+.
+\layout Verse
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fs2char.c
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+\family typewriter 
+_asm
+\begin_inset LatexCommand \index{\_asm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert floating point to signed char
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{\_\_asm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fs2uint.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+b,#10 
+\newline 
+00001$: 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+djnz\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+b,00001$ 
+\newline 
+_endasm
+\begin_inset LatexCommand \index{\_endasm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert floating point to unsigned int
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{\_\_endasm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fs2int.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+ ;
 \layout Standard
 
+Inline assembler code cannot reference any C-Labels, however it can reference
+ labels
+\begin_inset LatexCommand \index{Labels}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert floating point to signed int
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ defined by the inline assembler, e.g.:
+\layout Verse
 
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fs2ulong.
-\family default 
-\series default 
-\shape default 
-\size default 
-\emph default 
-\bar default 
-\noun default 
-\color default
-c
+\family typewriter 
+foo() { 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* some c code */ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_asm 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+; some assembler code 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ljmp $0003 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_endasm; 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* some more c code */ 
+\newline 
+clabel:\SpecialChar ~
+\SpecialChar ~
+/* inline assembler cannot reference this label */ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_asm
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+$0003: ;label (can be referenced by inline assembler only) 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+_endasm
+\begin_inset LatexCommand \index{\_endasm}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{\_\_endasm}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert floating point to unsigned long
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ ; 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* some more c code */
+\newline 
+}
 \layout Standard
 
+In other words inline assembly code can access labels defined in inline
+ assembly within the scope of the function.
+ The same goes the other way, i.e.
+ labels defines in inline assembly can not be accessed by C statements.
+\layout Section
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_fs2long.c
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
-
+Interfacing with Assembler Code
+\begin_inset LatexCommand \index{Assembler routines}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert floating point to signed long
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
-
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_uchar2fs.c
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\layout Subsection
 
+Global Registers used for Parameter Passing
+\begin_inset LatexCommand \index{Parameter passing}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert unsigned char to floating point
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
-
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_char2fs.c
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
 \layout Standard
 
+The compiler always uses the global registers 
+\emph on 
+DPL, DPH
+\begin_inset LatexCommand \index{DPTR, DPH, DPL}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert char to floating point number
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{DPTR}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_uint2fs.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+, B
+\begin_inset LatexCommand \index{B (mcs51, ds390 register)}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert unsigned int to floating point
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+\emph default 
+and
+\emph on 
+ ACC
+\begin_inset LatexCommand \index{ACC (mcs51, ds390 register)}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_int2fs.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert int to floating point numbers
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\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
 
-
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_ulong2fs.c
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+-stack-auto is used) or in data / xdata memory (depending on the memory
+ model).
+\layout Subsection
+
+Assembler Routine (non-reentrant)
 \layout Standard
 
+In the following example
+\begin_inset LatexCommand \index{reentrant}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert unsigned long to floating point number
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{Assembler routines (non-reentrant)}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-_long2fs.c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+ the function c_func calls an assembler routine asm_func, which takes two
+ parameters
+\begin_inset LatexCommand \index{function parameter}
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-convert long to floating point number
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
 
-\end_inset 
+.
+\layout Verse
 
 
+\family typewriter 
+extern int asm_func(unsigned char, unsigned char);
 \newline 
 
-\layout Standard
-\added_space_bottom bigskip 
-These support routines are developed in ANSI-C so there is room for space
- and speed improvement
-\begin_inset Foot
-collapsed false
+\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
 
-These floating point routines (
-\emph on 
-not
-\emph default 
- sinf(), cosf(), ...) for the mcs51 are implemented in assembler.
-\end_inset 
+The corresponding assembler function is:
+\layout Verse
 
-.
- Note if all these routines are used simultaneously the data space might
- overflow.
- For serious floating point usage the large model might be needed.
- Also notice that you don't have to call this routines directly.
- The compiler will use them automatically every time a floating point operation
- is required.
-\layout Section
 
-Library Routines
-\begin_inset LatexCommand \index{Libraries}
+\family typewriter 
+.globl _asm_func_PARM_2 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+.globl _asm_func 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+.area OSEG 
+\newline 
+_asm_func_PARM_2:
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+.ds    1 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+.area CSEG 
+\newline 
+_asm_func: 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+a,dpl 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+a,_asm_func_PARM_2 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dpl,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+dph
+\begin_inset LatexCommand \index{DPTR, DPH, DPL}
 
 \end_inset 
 
-
+,#0x00 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ret
 \layout Standard
 
+Note here that the return values
+\begin_inset LatexCommand \index{return value}
 
-\emph on 
-<pending: this is messy and incomplete - a little more information is in
- sdcc/doc/libdoc.txt
-\emph default 
- >
-\layout Subsection
-
-Compiler support routines (_gptrget, _mulint etc.)
-\layout Subsection
-
-Stdclib functions (puts, printf, strcat etc.)
-\layout Subsubsection
+\end_inset 
 
-<stdio.h>
+ 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 
 
-\begin_inset LatexCommand \index{<stdio.h>}
+ for a one byte parameter, 
+\begin_inset Quotes eld
+\end_inset 
 
+dptr
+\begin_inset Quotes erd
 \end_inset 
 
-As usual on embedded systems you have to provide your own 
-\family typewriter 
-getchar()
-\begin_inset LatexCommand \index{getchar()}
+ for two bytes, 
+\begin_inset Quotes eld
+\end_inset 
 
+b,dptr
+\begin_inset Quotes erd
 \end_inset 
 
-\family default 
-and 
-\family typewriter 
-putchar()
-\begin_inset LatexCommand \index{putchar()}
+ for three bytes and 
+\begin_inset Quotes eld
+\end_inset 
 
+acc,b,dptr
+\begin_inset Quotes erd
 \end_inset 
 
+ for a four bytes parameter.
+ The variable name for the second parameter will be _<function_name>_PARM_2.
+\newline 
 
-\family default 
- routines.
- SDCC does not know whether the system connects to a serial line with or
- without handshake, LCD, keyboard or other device.
- And whether a 
-\family typewriter 
-lf
-\family default 
- to 
-\family typewriter 
-crlf
-\family default 
- conversion within 
-\family typewriter 
-putchar()
-\family default 
- is intended.
- You'll find examples for serial routines f.e.
- in sdcc/device/lib.
-\layout Standard
+\newline 
+Assemble the assembler routine with the following command:
+\newline 
 
-The default
-\family typewriter 
- printf()
-\begin_inset LatexCommand \index{printf()}
+\newline 
 
-\end_inset 
+\family sans 
+\series bold 
+asx8051 -losg asmfunc.asm
+\newline 
 
+\newline 
 
 \family default 
-implementation in
-\family typewriter 
- printf_large.c
-\family default 
- does not support float (except on ds390).
- To enable this recompile it with the option 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+\series default 
+Then compile and link the assembler routine to the C source file with the
+ following command:
+\newline 
 
-\layout Standard
+\newline 
 
-\backslash 
-/
-\end_inset 
+\family sans 
+\series bold 
+sdcc cfunc.c asmfunc.rel
+\layout Subsection
 
-DUSE_FLOATS=1
-\begin_inset LatexCommand \index{USE\_FLOATS}
+Assembler Routine (reentrant)
+\layout Standard
 
-\end_inset 
+In this case
+\begin_inset LatexCommand \index{reentrant}
 
+\end_inset 
 
-\emph default 
- on the command line.
- Use
-\emph on 
- -
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset LatexCommand \index{Assembler routines (reentrant)}
 
-\backslash 
-/
 \end_inset 
 
--model-large
-\begin_inset LatexCommand \index{-\/-model-large}
+ the second parameter
+\begin_inset LatexCommand \index{function parameter}
 
 \end_inset 
 
+ onwards will be passed on the stack, the parameters are pushed from right
+ to left i.e.
+ after the call the leftmost parameter will be on the top of the stack.
+ Here is an example:
+\layout Verse
 
-\emph default 
- for the mcs51 port, since this uses a lot of memory.
-\layout Standard
 
-If you're short on memory you might want to use 
 \family typewriter 
-printf_small()
-\begin_inset LatexCommand \index{printf\_small()}
-
-\end_inset 
-
+extern int asm_func(unsigned char, unsigned char);
+\newline 
 
-\family default 
-\emph on 
-instead
-\emph default 
- of
-\family typewriter 
- printf().
+\newline 
+int c_func (unsigned char i, unsigned char j) reentrant 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return asm_func(i,j); 
+\newline 
+} 
+\newline 
 
-\family default 
- For the mcs51 there additionally are assembly versions 
-\family typewriter 
-printf_tiny()
-\begin_inset LatexCommand \index{printf\_tiny() (mcs51)}
+\newline 
+int main() 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c_func(10,9); 
+\newline 
+}
+\layout Standard
 
-\end_inset 
+The corresponding assembler routine is:
+\layout Verse
 
 
-\family default 
- (subset of printf using less than 270 bytes) and 
 \family typewriter 
-printf_fast()
-\begin_inset LatexCommand \index{printf\_fast() (mcs51)}
+.globl _asm_func 
+\newline 
+_asm_func: 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+push  _bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov _bp,sp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov r2,dpl
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov a,_bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add a,#0xfd 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov r0,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add  a,#0xfc ;?
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  r1,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  a,@r0 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+add  a,r2 ;?
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  dpl,a 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  dph,#0x00 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov  sp,_bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+pop  _bp 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ret
+\layout Standard
+\added_space_bottom bigskip 
+The compiling and linking procedure remains the same, however note the extra
+ entry & exit linkage required for the assembler code, _bp is the stack
+ frame pointer and is used to compute the offset into the stack for parameters
+ and local variables.
+\layout Section
+
+int (16 bit)
+\begin_inset LatexCommand \index{int (16 bit)}
 
 \end_inset 
 
-\family default 
-and
-\family typewriter 
- printf_fast_f()
-\begin_inset LatexCommand \index{printf\_fast\_f() (mcs51)}
+ and long (32 bit)
+\begin_inset LatexCommand \index{long (32 bit)}
 
 \end_inset 
 
+ Support
+\layout Standard
 
-\family default 
- (floating-point aware version of printf_fast) which should fit the requirements
- of many embedded systems (printf_fast() can be customized by unsetting
- #defines to 
-\emph on 
-not
-\emph default 
- support long variables and field widths).
-\layout Subsubsection
-
-<malloc.h>
-\begin_inset LatexCommand \index{malloc.h}
+For signed & unsigned int (16 bit) and long (32 bit) variables, division,
+ multiplication and modulus operations are implemented by support routines.
+ These support routines are all developed in ANSI-C to facilitate porting
+ to other MCUs, although some model specific assembler optimizations are
+ used.
+ The following files contain the described routines, all of them can be
+ found in <installdir>/share/sdcc/lib.
+\newline 
 
-\end_inset 
+\layout Standard
+\align center 
 
+\begin_inset  Tabular
+<lyxtabular version="3" rows="11" columns="2">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="left" 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
 
-As of SDCC 2.6.2 you no longer need to call an initialization routine before
- using dynamic memory allocation
-\begin_inset LatexCommand \index{dynamic memory allocation (malloc)}
 
+\series bold 
+Function
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
- and a default heap
-\begin_inset LatexCommand \index{heap (malloc)}
 
+\series bold 
+Description
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- space of 1024 bytes is provided for malloc to allocate memory from.
-\family default 
-If you need a different heap size you need to recompile _heap.c with the
- required size defined in HEAP_SIZE. It is recommended to make a copy of this
- file into your project directory and compile it there with:
-\layout Verse
+\layout Standard
 
+_mulint.c 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-sdcc -c _heap.c -D HEAD_SIZE=2048
-\newline 
-\family default 
-And then link it with:
-\layout Verse
+\layout Standard
 
-\family typewriter 
-sdcc main.rel _heap.rel
-\newline 
+16 bit multiplication
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\layout Subsection
+\layout Standard
 
-Math functions (sinf, powf, sqrtf etc.)
-\layout Subsubsection
+_divsint.c 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-<math.h>
 \layout Standard
 
-See definitions in file <math.h>.
-\layout Subsection
+ signed 16 bit division (calls _divuint)
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-Other libraries
 \layout Standard
 
-Libraries
-\begin_inset LatexCommand \index{Libraries}
-
+_divuint.c 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- 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}
+\layout Standard
 
+ unsigned 16 bit division
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\emph on 
-LGPL
-\emph default 
-.
-\layout Comment
+\layout Standard
 
-license statements for the libraries are missing.
- sdcc/device/lib/ser_ir.c
-\layout Comment
+_modsint.c
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-or _decdptr f.e.
- come with a GPL (as opposed to LGPL) License - this will not be liberal
- enough for many embedded programmers.
 \layout Standard
 
-If you have ported some library or want to share experience about some code
- which f.e.
- falls into any of these categories Busses (I
-\begin_inset Formula $^{\textrm{2}}$
+signed 16 bit modulus (calls _moduint)
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory
- cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel,
- Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list 
-\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599}
+\layout Standard
 
+_moduint.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\SpecialChar ~
-would certainly like to hear about it.
 \layout Standard
-\added_space_bottom bigskip 
-Programmers coding for embedded systems are not especially famous for being
- enthusiastic, so don't expect a big hurray but as the mailing list is searchabl
-e these references are very valuable.
- Let's help to create a climate where information is shared.
-\layout Section
 
-Memory Models
-\layout Subsection
+unsigned 16 bit modulus
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-MCS51 Memory Models
-\begin_inset LatexCommand \index{Memory model}
+\layout Standard
 
+_mullong.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{MCS51 memory model}
+32 bit multiplication
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
+_divslong.c 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\layout Subsubsection
+ signed 32 division (calls _divulong)
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-Small, Medium and Large
 \layout Standard
 
-SDCC allows three memory models for MCS51 code, 
-\shape slanted 
-small, medium
-\shape default 
- and 
-\shape slanted 
-large
-\shape default 
-.
- Modules compiled with different memory models should 
-\emph on 
-never
-\emph default 
- be combined together or the results would be unpredictable.
- The library routines supplied with the compiler are compiled as small,
- medium and large.
- The compiled library modules are contained in separate directories as small,
- medium and large so that you can link to the appropriate set.
+_divulong.c 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
-When the medium or large model is used all variables declared without a
- storage class will be allocated into the external ram, this includes all
- parameters and local variables (for non-reentrant
-\begin_inset LatexCommand \index{reentrant}
+unsigned 32 division
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
+_modslong.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- functions).
- When the small model is used variables without storage class are allocated
- in the internal ram.
 \layout Standard
 
-Judicious usage of the processor specific storage classes
-\begin_inset LatexCommand \index{Storage class}
+ signed 32 bit modulus (calls _modulong)
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
+
+_modulong.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- and the 'reentrant' function type will yield much more efficient code,
- than using the large model.
- Several optimizations are disabled when the program is compiled using the
- large model, it is therefore recommended that the small model be used unless
- absolutely required.
-\layout Subsubsection
+\layout Standard
 
-External Stack
-\begin_inset LatexCommand \label{sub:External-Stack}
+unsigned 32 bit modulus
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
 \end_inset 
 
 
-\begin_inset LatexCommand \index{stack}
+\newline 
 
-\end_inset 
+\layout Standard
 
+Since they are compiled as 
+\emph on 
+non-reentrant
+\emph default 
 
-\begin_inset LatexCommand \index{External stack (mcs51)}
+\begin_inset LatexCommand \index{reentrant}
 
 \end_inset 
 
+, interrupt
+\begin_inset LatexCommand \index{interrupt}
 
-\layout Standard
+\end_inset 
 
-The external stack (-
+ service routines should not do any of the above operations.
+ If this is unavoidable then the above routines will need to be compiled
+ with the 
+\emph on 
+-
 \begin_inset ERT
 status Collapsed
 
@@ -16242,20 +16151,16 @@ status Collapsed
 /
 \end_inset 
 
--xstack option
-\begin_inset LatexCommand \index{-\/-xstack}
+-stack-auto
+\begin_inset LatexCommand \index{-\/-stack-auto}
 
 \end_inset 
 
-) is located in pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
-
-\end_inset 
 
- memory (usually at the start of the external ram segment) and uses all
- unused space in pdata (max.
- 256 bytes).
- When -
+\emph default 
+ option, after which the source program will have to be compiled with 
+\emph on 
+-
 \begin_inset ERT
 status Collapsed
 
@@ -16265,581 +16170,820 @@ status Collapsed
 /
 \end_inset 
 
--xstack option is used to compile the program, the parameters and local
- variables
-\begin_inset LatexCommand \index{local variables}
+-int-long-reent
+\begin_inset LatexCommand \index{-\/-int-long-reent}
 
 \end_inset 
 
- of all reentrant functions are allocated in this area.
- This option is provided for programs with large stack space requirements.
- When used with the -
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
 
-\backslash 
-/
-\end_inset 
+\emph default 
+ option.
+ Notice that you don't have to call these routines directly.
+ The compiler will use them automatically every time an integer operation
+ is required.
+\layout Section
 
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+Floating Point Support
+\begin_inset LatexCommand \index{Floating point support}
 
 \end_inset 
 
- option, all parameters and local variables are allocated on the external
- stack (note: support libraries will need to be recompiled with the same
- options.
- There is a predefined target in the library makefile).
+
 \layout Standard
 
-The compiler outputs the higher order address byte of the external ram segment
- into port P2
-\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
+SDCC supports IEEE (single precision 4 bytes) floating point numbers.
+ The floating point support routines are derived from gcc's floatlib.c and
+ consist of the following routines:
+\newline 
 
-\end_inset 
+\layout Standard
+\align center 
 
- (see also section 
-\begin_inset LatexCommand \ref{sub:MCS51-variants}
+\size footnotesize 
 
-\end_inset 
+\begin_inset  Tabular
+<lyxtabular version="3" rows="17" columns="2">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="left" 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
 
-), therefore when using the External Stack option, this port 
-\emph on 
-may not
-\emph default 
- be used by the application program.
-\layout Subsection
+\layout Standard
 
-DS390 Memory Model
-\begin_inset LatexCommand \index{Memory model}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+Function 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{DS390 memory model}
-
+Description
 \end_inset 
-
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-The only model supported is Flat 24
-\begin_inset LatexCommand \index{Flat 24 (DS390 memory model)}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fsadd.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-.
- This generates code for the 24 bit contiguous addressing mode of the Dallas
- DS80C390 part.
- In this mode, up to four meg of external RAM or code space can be directly
- addressed.
- See the data sheets at www.dalsemi.com for further information on this part.
-\newline 
-
-\newline 
-Note that the compiler does not generate any code to place the processor
- into 24 bitmode (although 
-\emph on 
-tinibios
-\emph default 
- in the ds390 libraries will do that for you).
- If you don't use 
-\emph on 
-tinibios
-\emph default 
+\layout Standard
 
-\begin_inset LatexCommand \index{Tinibios (DS390)}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+add floating point numbers
 \end_inset 
-
-, the boot loader or similar code must ensure that the processor is in 24
- bit contiguous addressing mode before calling the SDCC startup code.
-\newline 
-
-\newline 
-Like the 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fssub.c 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
--model-large
-\emph default 
- option, variables will by default be placed into the XDATA segment.
-\newline 
+\layout Standard
 
-\newline 
-Segments may be placed anywhere in the 4 meg address space using the usual
- -
-\begin_inset ERT
-status Collapsed
+
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+subtract floating point numbers 
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fsdiv.c 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
--*-loc options.
- Note that if any segments are located above 64K, the -r flag must be passed
- to the linker to generate the proper segment relocations, and the Intel
- HEX output format must be used.
- The -r flag can be passed to the linker by using the option 
-\emph on 
--Wl-r
-\emph default 
- on the SDCC command line.
- However, currently the linker can not handle code segments > 64k.
-\layout Section
+\layout Standard
 
-Pragmas
-\begin_inset LatexCommand \label{sec:Pragmas}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+divide floating point numbers 
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{Pragmas}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fsmul.c 
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-SDCC supports the following #pragma directives:
-\layout Itemize
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+multiply floating point numbers 
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\series bold 
-save
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma save}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fs2uchar.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- - this will save most current options to the save/restore stack.
- See #pragma\SpecialChar ~
-restore.
-\layout Itemize
-
-
-\series bold 
-restore
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma restore}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert floating point to unsigned char
 \end_inset 
+</cell>
+</row>
+<row topline="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 #pragma\SpecialChar ~
-save.
-\newline 
+\layout Standard
 
-\layout Itemize
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fs2char.c
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\series bold 
-callee_saves
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma callee\_saves}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert floating point to signed char
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{function prologue}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fs2uint.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- function1[,function2[,function3...]] - The compiler by default uses a caller
- saves convention for register saving across function calls, however this
- can cause unnecessary register pushing & popping
-\begin_inset LatexCommand \index{push/pop}
+\layout Standard
 
-\end_inset 
 
- when calling small functions from larger functions.
- This option can be used to switch off the register saving convention for
- the function names specified.
- The compiler will not save registers when calling these functions, extra
- code need to be manually inserted at the entry & exit for these functions
- to save & restore the registers used by these functions, this can SUBSTANTIALLY
- reduce code & improve run time performance of the generated code.
- In the future the compiler (with inter procedural analysis) may be able
- to determine the appropriate scheme to use for each function call.
- If -
-\begin_inset ERT
-status Collapsed
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert floating point to unsigned int
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \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}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fs2int.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- is appended to the list of functions specified in the command line.
-\layout Itemize
-
-
-\series bold 
-exclude
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma exclude}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert floating point to signed int
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation
- of pairs of push/pop
-\begin_inset LatexCommand \index{push/pop}
+\layout Standard
 
-\end_inset 
 
- instructions in 
-\emph on 
-I
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fs2ulong.
+\family default 
+\series default 
+\shape default 
+\size default 
 \emph default 
-nterrupt
-\begin_inset LatexCommand \index{interrupt}
-
+\bar default 
+\noun default 
+c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\emph on 
-S
-\emph default 
-ervice 
-\emph on 
-R
-\emph default 
-outines.
- The directive should be placed immediately before the ISR function definition
- and it affects ALL ISR functions following it.
- To enable the normal register saving for ISR functions use #pragma\SpecialChar ~
-exclude\SpecialChar ~
-none
-\begin_inset LatexCommand \index{\#pragma exclude}
-
-\end_inset 
+\layout Standard
 
-.
- See also the related keyword _naked
-\begin_inset LatexCommand \index{\_naked}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert floating point to unsigned long
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{\_\_naked}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_fs2long.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-.
-\layout Itemize
-
-
-\series bold 
-less_pedantic
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma less\_pedantic}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert floating point to signed long
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- - the compiler will not warn you anymore for obvious mistakes, you'r on
- your own now ;-(
-\layout Itemize
-
+\layout Standard
 
-\series bold 
-disable_warning
-\series default 
- <nnnn>
-\begin_inset LatexCommand \index{\#pragma disable\_warning}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_uchar2fs.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- - the compiler will not warn you anymore about warning number <nnnn>.
-\layout Itemize
-
-
-\series bold 
-nogcse
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma nogcse}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert unsigned char to floating point
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- - will stop global common subexpression elimination.
-\layout Itemize
-
-
-\series bold 
-noinduction
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma noinduction}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_char2fs.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- - will stop loop induction optimizations.
-\layout Itemize
-
-
-\series bold 
-noinvariant
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma noinvariant}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert char to floating point number
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- - will not do loop invariant optimizations.
- For more details see Loop Invariants in section
-\begin_inset LatexCommand \ref{sub:Loop-Optimizations}
-
-\end_inset 
+\layout Standard
 
-.
-\layout Itemize
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_uint2fs.c
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\series bold 
-noiv
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma noiv}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert unsigned int to floating point
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- - Do not generate interrupt
-\begin_inset LatexCommand \index{interrupt}
-
-\end_inset 
+\layout Standard
 
- vector table
-\begin_inset LatexCommand \index{interrupt vector table}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_int2fs.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- entries for all ISR functions defined after the pragma.
- This is useful in cases where the interrupt vector table must be defined
- manually, or when there is a secondary, manually defined interrupt vector
- table (e.g.
- for the autovector feature of the Cypress EZ-USB FX2).
- More elegantly this can be achieved by obmitting the optional interrupt
- number after the interrupt keyword, see section 
-\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines}
-
-\end_inset 
+\layout Standard
 
-\SpecialChar ~
-about interrupts.
-\layout Itemize
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert int to floating point numbers
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\series bold 
-nojtbound
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma nojtbound}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_ulong2fs.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- - will not generate code for boundary value checking, when switch statements
- are turned into jump-tables (dangerous).
- For more details see section 
-\begin_inset LatexCommand \ref{sub:'switch'-Statements}
+\layout Standard
 
-\end_inset 
 
-.
-\layout Itemize
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert unsigned long to floating point number
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\series bold 
-noloopreverse
-\series default 
-
-\begin_inset LatexCommand \index{\#pragma noloopreverse}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+_long2fs.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- - Will not do loop reversal optimization
-\layout Itemize
-
-
-\series bold 
-nooverlay
-\series default 
+\layout Standard
 
-\begin_inset LatexCommand \index{\#pragma nooverlay}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+convert long to floating point number
 \end_inset 
+</cell>
+</row>
+</lyxtabular>
 
- - the compiler will not overlay the parameters and local variables of a
- function.
-\layout Itemize
-
-
-\series bold 
-stackauto
-\series default 
+\end_inset 
 
-\begin_inset LatexCommand \index{\#pragma stackauto}
 
-\end_inset 
+\newline 
 
-- See option -
-\begin_inset ERT
-status Collapsed
+\layout Standard
+\added_space_bottom bigskip 
+These support routines are developed in ANSI-C so there is room for space
+ and speed improvement
+\begin_inset Foot
+collapsed false
 
 \layout Standard
 
-\backslash 
-/
+These floating point routines (
+\emph on 
+not
+\emph default 
+ sinf(), cosf(), ...) for the mcs51 are implemented in assembler.
 \end_inset 
 
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
-
-\end_inset 
+.
+ Note if all these routines are used simultaneously the data space might
+ overflow.
+ For serious floating point usage the large model might be needed.
+ Also notice that you don't have to call this routines directly.
+ The compiler will use them automatically every time a floating point operation
+ is required.
+\layout Section
 
- and section 
-\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
+Library Routines
+\begin_inset LatexCommand \index{Libraries}
 
 \end_inset 
 
- Parameters and Local Variables.
-\layout Itemize
 
+\layout Standard
 
-\series bold 
-opt_code_speed
-\series default 
-\begin_inset LatexCommand \index{\#pragma opt\_code\_speed}
-
-\end_inset 
 
-- The compiler will optimize code generation towards fast code, possibly
- at the expense of code size.
- Currently this has little effect.
-\layout Itemize
+\emph on 
+<pending: this is messy and incomplete - a little more information is in
+ sdcc/doc/libdoc.txt
+\emph default 
+ >
+\layout Subsection
 
+Compiler support routines (_gptrget, _mulint etc.)
+\layout Subsection
 
-\series bold 
-opt_code_size
-\series default 
-\begin_inset LatexCommand \index{\#pragma opt\_code\_size}
+Stdclib functions (puts, printf, strcat etc.)
+\layout Subsubsection
 
-\end_inset 
+<stdio.h>
+\layout Paragraph
 
-- The compiler will optimize code generation towards compact code, possibly
- at the expense of code speed.
- Currently this has little effect.
-\layout Itemize
+getchar(), putchar()
+\layout Standard
 
 
-\series bold 
-opt_code_balanced
-\series default 
-\begin_inset LatexCommand \index{\#pragma opt\_code\_balanced}
+\begin_inset LatexCommand \index{<stdio.h>}
 
 \end_inset 
 
-- The compiler will attempt to generate code that is both compact and fast,
- as long as meeting one goal is not a detriment to the other (this is the
- default).
-\layout Itemize
-
-
-\series bold 
-std_sdcc89
-\series default 
-\begin_inset LatexCommand \index{\#pragma std\_sdcc89}
+As usual on embedded systems you have to provide your own 
+\family typewriter 
+getchar()
+\begin_inset LatexCommand \index{getchar()}
 
 \end_inset 
 
-- Generally follow the C89 standard, but allow SDCC features that conflict
- with the standard (default).
-\layout Itemize
-
-
-\series bold 
-std_c89
-\series default 
  
-\begin_inset LatexCommand \index{\#pragma std\_c89}
+\family default 
+and 
+\family typewriter 
+putchar()
+\begin_inset LatexCommand \index{putchar()}
 
 \end_inset 
 
-- Follow the C89 standard and disable SDCC features that conflict with the
- standard.
-\layout Itemize
-
 
-\series bold 
-std_sdcc99
-\series default 
-\begin_inset LatexCommand \index{\#pragma std\_sdcc99}
+\family default 
+ routines.
+ SDCC does not know whether the system connects to a serial line with or
+ without handshake, LCD, keyboard or other device.
+ And whether a 
+\family typewriter 
+lf
+\family default 
+ to 
+\family typewriter 
+crlf
+\family default 
+ conversion within 
+\family typewriter 
+putchar()
+\family default 
+ is intended.
+ You'll find examples for serial routines f.e.
+ in sdcc/device/lib.
+ For the mcs51 this minimalistic polling 
+\family typewriter 
+putchar()
+\family default 
+ routine might be a start:
+\layout Verse
 
-\end_inset 
 
-- Generally follow the C99 standard, but allow SDCC features that conflict
- with the standard (incomplete support).
-\layout Itemize
+\family typewriter 
+void putchar (char c) { 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+while (!TI)\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ /* assumes UART is initialized */
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+TI = 0;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+SBUF = c;
+\newline 
+}
+\layout Paragraph
 
+printf()
+\layout Standard
 
-\series bold 
-std_c99
-\series default 
-\begin_inset LatexCommand \index{\#pragma std\_c99}
+The default
+\family typewriter 
+ printf()
+\begin_inset LatexCommand \index{printf()}
 
 \end_inset 
 
-- Follow the C99 standard and disable SDCC features that conflict with the
- standard (incomplete support).
-\layout Itemize
-
-
-\series bold 
-codeseg
-\series default 
- <name>
-\begin_inset LatexCommand \index{\#pragma codeseg}
-
-\end_inset 
 
-- Use this name (max.
- 8 characters) for the code segment.
- See option -
+\family default 
+ implementation in
+\family typewriter 
+ printf_large.c
+\family default 
+ does not support float (except on ds390).
+ To enable this recompile it with the option 
+\emph on 
+-
 \begin_inset ERT
 status Collapsed
 
@@ -16849,21 +16993,17 @@ status Collapsed
 /
 \end_inset 
 
--codeseg.
-\layout Itemize
+DUSE_FLOATS=1
+\begin_inset LatexCommand \index{USE\_FLOATS}
 
+\end_inset 
 
-\series bold 
-constseg
-\series default 
- <name>
-\begin_inset LatexCommand \index{\#pragma constseg}
-
-\end_inset 
 
-- Use this name (max.
- 8 characters) for the const segment.
- See option -
+\emph default 
+ on the command line.
+ Use
+\emph on 
+ -
 \begin_inset ERT
 status Collapsed
 
@@ -16873,234 +17013,148 @@ status Collapsed
 /
 \end_inset 
 
--constseg.
-\layout Standard
-
-The preprocessor SDCPP
-\begin_inset LatexCommand \index{sdcpp (preprocessor)}
-
-\end_inset 
-
- supports the following #pragma directives:
-\layout Itemize
-
-
-\series bold 
-preproc_asm
-\series default 
-
-\begin_inset LatexCommand \index{\#pragma preproc\_asm}
+-model-large
+\begin_inset LatexCommand \index{-\/-model-large}
 
 \end_inset 
 
- (+ | -) - switch _asm _endasm block preprocessing on / off.
- Default is on.
- You use this prama to define multilines of assembly code.
- This will prevent the preprocessor from changing the formating required
- by assembly code.
- Below is an example on how to use this pragma.
-\layout Verse
 
+\emph default 
+ for the mcs51 port, since this uses a lot of memory.
+\layout Standard
 
+If you're short on code memory you might want to use 
 \family typewriter 
-#pragma preproc_asm -
-\begin_inset LatexCommand \index{\#pragma preproc\_asm}
+printf_small()
+\begin_inset LatexCommand \index{printf\_small()}
 
 \end_inset 
 
 
-\newline 
-#define MYDELAY _asm
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-nop ;my assembly comment...
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-nop
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-nop
-\newline 
-_endasm
-\newline 
-#pragma preproc_asm +
-\newline 
-
-\newline 
-void foo (void) 
-\newline 
-{ 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- ...
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- MYDELAY;
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- ...
+\family default 
  
-\newline 
-} 
-\newline 
-
-\layout Standard
-
-The pragma's are intended to be used to turn-on or off certain optimizations
- which might cause the compiler to generate extra stack / data space to
- store compiler generated temporary variables.
- This usually happens in large functions.
- Pragma directives should be used as shown in the following example, they
- are used to control options & optimizations for a given function; pragmas
- should be placed before and/or after a function, placing pragma's inside
- a function body could have unpredictable results.
-\layout Verse
-
+\emph on 
+instead
+\emph default 
+ of
+\family typewriter 
+ printf().
 
+\family default 
+ For the mcs51 there additionally are assembly versions 
 \family typewriter 
-#pragma save
-\begin_inset LatexCommand \index{\#pragma save}
+printf_tiny()
+\begin_inset LatexCommand \index{printf\_tiny() (mcs51)}
 
 \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}
+\family default 
+ (subset of printf using less than 270 bytes) and 
+\family typewriter 
+printf_fast()
+\begin_inset LatexCommand \index{printf\_fast() (mcs51)}
 
 \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}
+\family default 
+and
+\family typewriter 
+ printf_fast_f()
+\begin_inset LatexCommand \index{printf\_fast\_f() (mcs51)}
 
 \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.
+\family default 
+ (floating-point aware version of printf_fast) which should fit the requirements
+ of many embedded systems (printf_fast() can be customized by unsetting
+ #defines to 
+\emph on 
+not
+\emph default 
+ support long variables and field widths).
+ Be sure to use only one of these printf options within a project.
 \newline 
 
-\newline 
+\layout Standard
 
-\newline 
+Feature matrix of different 
+\emph on 
+printf
+\emph default 
+ options on mcs51.
+\layout Standard
 
-\layout Section
 
-Defines Created by the Compiler
+\begin_inset  Tabular
+<lyxtabular version="3" rows="14" columns="7">
+<features islongtable="true">
+<column alignment="left" valignment="center" leftline="true" width="14col%">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="12col%">
+<column alignment="center" valignment="top" leftline="true" width="10col%">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="12col%">
+<column alignment="center" valignment="top" rightline="true" width="0">
+<row topline="true" bottomline="true" endhead="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
-The compiler creates the following #defines
-\begin_inset LatexCommand \index{\#defines}
 
+\series bold 
+\size large 
+mcs51
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{Defines created by the compiler}
+printf
+\begin_inset LatexCommand \index{printf}
 
 \end_inset 
 
-:
-\newline 
-
-\layout Standard
-
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="11" columns="2">
-<features>
-<column alignment="left" valignment="top" leftline="true" width="3in">
-<column alignment="left" valignment="top" leftline="true" rightline="true" width="3in">
-<row topline="true" bottomline="true">
+\end_inset 
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-
-\series bold 
-#define
+printf 
+\size scriptsize 
+USE_FLOATS=1
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-
-\series bold 
-Description
+printf_small
 \end_inset 
 </cell>
-</row>
-<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC
-\begin_inset LatexCommand \index{SDCC}
-
+printf_fast
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
+
+printf_fast_f
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -17108,72 +17162,67 @@ SDCC
 
 \layout Standard
 
-Always defined.
- Since version 2.5.6 the version number as an int (ex.
- 256)
+printf_tiny
 \end_inset 
 </cell>
 </row>
-<row topline="true">
+<row topline="true" endhead="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_mcs51
-\begin_inset LatexCommand \index{SDCC\_mcs51}
-
+filename
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- or SDCC_ds390
-\begin_inset LatexCommand \index{SDCC\_ds390}
+\layout Standard
 
-\end_inset 
-
- or SDCC_z80
-\begin_inset LatexCommand \index{SDCC\_z80}
 
-\end_inset 
-
-, etc.
+\size scriptsize 
+printf_large.c
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-depending on the model used (e.g.: -mds390)
+
+\size scriptsize 
+printf_large.c
 \end_inset 
 </cell>
-</row>
-<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-__mcs51
-\begin_inset LatexCommand \index{\_\_mcs51}
 
+\size scriptsize 
+printfl.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-, __ds390
-\begin_inset LatexCommand \index{\_\_ds390}
-
-\end_inset 
+\layout Standard
 
-, __hc08
-\begin_inset LatexCommand \index{\_\_hc08}
 
+\size scriptsize 
+printf_fast.c
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-, __z80
-\begin_inset LatexCommand \index{\_\_z80}
+\layout Standard
 
-\end_inset 
 
-, etc
+\size scriptsize 
+printf_fast_f.c
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -17181,134 +17230,123 @@ __mcs51
 
 \layout Standard
 
-depending on the model used (e.g.
- -mz80)
+
+\size scriptsize 
+printf_tiny.c
 \end_inset 
 </cell>
 </row>
-<row topline="true">
+<row topline="true" endhead="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_STACK_AUTO
-\begin_inset LatexCommand \index{SDCC\_STACK\_AUTO}
 
+\begin_inset Quotes sld
+\end_inset 
+
+Hello World
+\begin_inset Quotes srd
 \end_inset 
 
+ size
+\layout Standard
 
+small / large
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-when 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+1.7k / 2.4k
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--stack-auto
-\emph default 
- option is used
+4.3k / 5.6k
 \end_inset 
 </cell>
-</row>
-<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_MODEL_SMALL
-\begin_inset LatexCommand \index{SDCC\_MODEL\_SMALL}
-
+1.2k / 1.8k
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
+1.3k / 1.3k
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-when 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+1.9k / 1.9k
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--model-small
-\emph default 
- is used
+0.44k / 0.44k
 \end_inset 
 </cell>
 </row>
-<row topline="true">
+<row topline="true" endhead="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_MODEL_MEDIUM
-\begin_inset LatexCommand \index{SDCC\_MODEL\_MEDIUM}
-
-\end_inset 
-
+code size
+\layout Standard
 
+small / large
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-when 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+1.4k / 2.0k
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--model-medium
-\emph default 
- is used
+2.8k / 3.7k
 \end_inset 
 </cell>
-</row>
-<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_MODEL_LARGE
-\begin_inset LatexCommand \index{SDCC\_MODEL\_LARGE}
-
+0.45k / 0.47k (+ _ltoa)
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
+1.2k / 1.2k
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -17316,21 +17354,15 @@ SDCC_MODEL_LARGE
 
 \layout Standard
 
-when 
-\emph on 
--
-\begin_inset ERT
-status Collapsed
+1.6k / 1.6k
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--model-large
-\emph default 
- is used
+0.26k / 0.26k
 \end_inset 
 </cell>
 </row>
@@ -17340,76 +17372,125 @@ status Collapsed
 
 \layout Standard
 
-SDCC_USE_XSTACK
-\begin_inset LatexCommand \index{SDCC\_USE\_XSTACK}
-
-\end_inset 
-
-
+formats
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-when 
+cdi
 \emph on 
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
-
-\backslash 
-/
-\end_inset 
-
--xstack
+o
 \emph default 
- option is used
+psux
 \end_inset 
 </cell>
-</row>
-<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_STACK_TENBIT
-\begin_inset LatexCommand \index{SDCC\_STACK\_TENBIT}
-
-\end_inset 
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+cd
+\family default 
+\series default 
+\shape default 
+\size default 
+\emph default 
+\bar default 
+\noun default 
+f
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+i
+\family default 
+\series default 
+\shape default 
+\size default 
+\emph on 
+\bar default 
+\noun default 
+o
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+psux
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-when 
+c
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+d
+\family default 
+\series default 
+\shape default 
+\size default 
 \emph on 
--mds390
+\bar default 
+\noun default 
+o
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+s
+\family default 
+\series default 
+\shape default 
+\size default 
 \emph default 
- is used
+\bar default 
+\noun default 
+x
 \end_inset 
 </cell>
-</row>
-<row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SDCC_MODEL_FLAT24
-\begin_inset LatexCommand \index{SDCC\_MODEL\_FLAT24}
-
+cdsux
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
+cdfsux
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -17417,654 +17498,425 @@ SDCC_MODEL_FLAT24
 
 \layout Standard
 
-when 
-\emph on 
--mds390
-\emph default 
- is used
+cdsux
 \end_inset 
 </cell>
 </row>
-</lyxtabular>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\end_inset 
+\layout Standard
 
+long (32 bit) support
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\layout Chapter
+\layout Standard
 
-Notes on supported Processors
-\layout Section
+x
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-MCS51 variants
-\begin_inset LatexCommand \label{sub:MCS51-variants}
+\layout Standard
 
+x
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{MCS51 variants}
-
+x
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-MCS51 processors are available from many vendors and come in many different
- flavours.
- While they might differ considerably in respect to Special Function Registers
- the core MCS51 is usually not modified or is kept compatible.
-\layout Subsection
+x
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-pdata access by SFR 
 \layout Standard
 
-With the upcome of devices with internal xdata and flash memory devices
- using port P2
-\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+x
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- as dedicated I/O port is becoming more popular.
- Switching the high byte for pdata
-\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
+\layout Standard
 
+-
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- access which was formerly done by port P2 is then achieved by a Special
- Function Register
-\begin_inset LatexCommand \index{sfr}
+\layout Standard
 
+byte arguments on stack
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-.
- In well-established MCS51 tradition the address of this 
-\emph on 
-sfr
-\emph default 
- is where the chip designers decided to put it.
- Needless to say that they didn't agree on a common name either.
- So that the startup code can correctly initialize xdata variables, you
- should define an sfr with the name _XPAGE
-\family typewriter 
-
-\begin_inset LatexCommand \index{\_XPAGE (mcs51)}
+\layout Standard
 
+b
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-
-\family default 
- at the appropriate location if the default, port P2, is not used for this.
- Some examples are:
-\layout Verse
-
-
-\family typewriter 
-__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family */
-\layout Verse
-
-
-\family typewriter 
-__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips */
-\layout Verse
-
-
-\family typewriter 
-__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips */
 \layout Standard
 
-For more exotic implementations further customizations may be needed.
- See section 
-\begin_inset LatexCommand \ref{sub:Startup-Code}
-
+b
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- for other possibilities.
-\layout Subsection
-
-Other Features available by SFR
 \layout Standard
-\added_space_bottom bigskip 
-Some MCS51 variants offer features like Double DPTR
-\begin_inset LatexCommand \index{DPTR}
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-, multiple DPTR, decrementing DPTR, 16x16 Multiply.
- These are currently not used for the MCS51 port.
- If you absolutely need them you can fall back to inline assembly or submit
- a patch to SDCC.
-\layout Section
-
-DS400 port
 \layout Standard
-\added_space_bottom bigskip 
-The DS80C400
-\begin_inset LatexCommand \index{DS80C400}
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{DS400}
-
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- microcontroller has a rich set of peripherals.
- In its built-in ROM library it includes functions to access some of the
- features, among them is a TCP stack with IP4 and IP6 support.
- Library headers (currently in beta status) and other files are provided
- at 
-\size footnotesize 
-
-\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html}
+\layout Standard
 
+-
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-.
-\layout Section
-
-The Z80 and gbz80 port
 \layout Standard
 
-SDCC can target both the Zilog Z80
-\begin_inset LatexCommand \index{Z80}
+float format
+\begin_inset LatexCommand \index{Floating point support}
 
 \end_inset 
 
- and the Nintendo Gameboy's Z80-like gbz80
-\begin_inset LatexCommand \index{gbz80 (GameBoy Z80)}
 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-.
- The Z80 port is passed through the same 
-\emph on 
-regressions tests
-\begin_inset LatexCommand \index{Regression test}
+\layout Standard
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\emph default 
- (see section 
-\begin_inset LatexCommand \ref{sec:Quality-control}
-
+%f
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-) as the MCS51 and DS390 ports, so floating point support, support for long
- variables and bitfield support is fine.
- See mailing lists and forums about interrupt routines.
 \layout Standard
-\added_space_bottom bigskip 
-As always, the code is the authoritative reference - see z80/ralloc.c and
- z80/gen.c.
- The stack
-\begin_inset LatexCommand \index{Z80!stack}
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- frame is similar to that generated by the IAR Z80 compiler.
- IX is used as the base pointer, HL and IY are used as a temporary registers,
- and BC and DE are available for holding variables.
- Return values
-\begin_inset LatexCommand \index{Z80!return value}
+\layout Standard
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- for the Z80 port are stored in L (one byte), HL (two bytes), or DEHL (four
- bytes).
- The gbz80 port use the same set of registers for the return values, but
- in a different order of significance: E (one byte), DE (two bytes), or
- HLDE (four bytes).
-\layout Section
+\layout Standard
+
+%f
+\begin_inset Foot
+collapsed true
 
-The HC08 port
 \layout Standard
 
-The port to the Freescale/Motorola HC08
-\begin_inset LatexCommand \index{HC08}
+Range limited to +/- 4294967040, precision limited to 8 digits past decimal
+\end_inset 
+
 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- family has been added in October 2003, and is still undergoing some basic
- development.
- The code generator is complete, but the register allocation is still quite
- unoptimized.
- Some of the SDCC's standard C library functions have embedded non-HC08
- inline assembly and so are not yet usable.
 \layout Standard
-\added_space_bottom bigskip 
-The HC08 port passes the regression test suite (see section 
-\begin_inset LatexCommand \ref{sec:Quality-control}
 
+-
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-).
-\layout Section
-\pagebreak_top 
-The PIC14 port
 \layout Standard
 
-The 14bit PIC
-\begin_inset LatexCommand \index{PIC14}
-
+float formats %e %g
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- port still requires a major effort from the development community.
- However it can work for simple code.
- It passes its (smaller set of) regression tests
-\begin_inset LatexCommand \index{Regression test (PIC14)}
+\layout Standard
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- in the directory 
-\shape italic 
-sdcc/src/regression
-\shape default 
-.
-\layout Subsection
-
-C code and 14bit PIC code page
-\begin_inset LatexCommand \index{code page (pic14)}
+\layout Standard
 
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- and RAM banks
-\begin_inset LatexCommand \index{RAM bank (pic14)}
+\layout Standard
 
+-
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-The linker organizes allocation for the code page and RAM banks.
- It does not have intimate knowledge of the code flow.
- It will put all the code section of a single asm file into a single code
- page.
- In order to make use of multiple code pages, separate asm files must be
- used.
- The compiler treats all functions of a single C file as being in the same
- code page unless it is non static.
- The compiler treats all local variables of a single C file as being in
- the same RAM bank unless it is an extern.
-\newline 
-
-\newline 
-To get the best follow these guide lines:
-\layout Enumerate
-
-make local functions static, as non static functions require code page selection
- overhead.
-\layout Enumerate
-
-Make local variables static as extern variables require RAM bank selection
- overhead.
-\layout Enumerate
-
-For devices that have multiple code pages it is more efficient to use the
- same number of files as pages, i.e.
- for the 16F877 use 4 separate files and i.e.
- for the 16F874 use 2 separate files.
- This way the linker can put the code for each file into different code
- pages and the compiler can allocate reusable variables more efficiently
- and there's less page selection overhead.
- And as for any 8 bit micro (especially for PIC 14 as they have a very simple
- instruction set) use 'unsigned char' whereever possible instead of 'int'.
-\layout Subsection
+-
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-Creating a device include file 
 \layout Standard
 
-For generating a device include file
-\begin_inset LatexCommand \index{PIC14!Header files}
-
+-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- use the support perl script inc2h.pl kept in directory support/script.
-\layout Subsection
-
-Interrupt code
 \layout Standard
 
-For the interrupt function, use the keyword 'interrupt'
-\begin_inset LatexCommand \index{PIC14!interrupt}
-
+-
 \end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- with level number of 0 (PIC14 only has 1 interrupt so this number is only
- there to avoid a syntax error - it ought to be fixed).
- E.g.:
-\layout Verse
-
-
-\family typewriter 
-void Intr(void) interrupt 0
-\newline 
-{
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-T0IF = 0; /* Clear timer interrupt */
-\newline 
-}
-\layout Subsection
-
-Linking and assembling
 \layout Standard
 
-For assembling you can use either GPUTILS'
-\begin_inset LatexCommand \index{gputils (pic tools)}
-
+field width
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- gpasm.exe or MPLAB's mpasmwin.exe.
- GPUTILS is available from 
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
+\layout Standard
 
+x
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-.
- For linking you can use either GPUTIL's gplink or MPLAB's mplink.exe.
- If you use MPLAB and an interrupt function then the linker script file
- vectors section will need to be enlarged to link with mplink.
-\newline 
+\layout Standard
 
-\newline 
-Here is a 
-\family typewriter 
-Makefile
-\family default 
- using GPUTILS:
-\layout Verse
+x
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\family typewriter 
-.c.o:
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcc -S -V -mpic14 -p16F877 $< 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-gpasm -c $*.asm
-\newline 
+-
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
-$(PRJ).hex: $(OBJS) 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-gplink -m -s $(PRJ).lkr -o $(PRJ).hex $(OBJS) libsdcc.lib
 \layout Standard
 
-Here is a 
-\family typewriter 
-Makefile
-\family default 
- using MPLAB:
-\layout Verse
+x
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\family typewriter 
-.c.o: 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-sdcc -S -V -mpic14 -p16F877 $< 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mpasmwin /q /o $*.asm
-\newline 
+x
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\newline 
-$(PRJ).hex: $(OBJS) 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib
 \layout Standard
 
-Please note that indentations within a
-\family typewriter 
- Makefile
-\family default 
- have to be done with a tabulator character.
-\layout Subsection
+-
+\end_inset 
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-Command-line options
 \layout Standard
 
-Besides the switches common to all SDCC backends, the PIC14 port accepts
- the following options (for an updated list see sdcc -
-\begin_inset ERT
-status Collapsed
+string speed
+\begin_inset Foot
+collapsed true
 
 \layout Standard
 
+Execution time of printf("%s%c%s%c%c%c", "Hello", ' ', "World", '!', '
 \backslash 
-/
+r', '
+\backslash 
+n'); standard 8051 @ 22.1184 MHz, empty putchar()
 \end_inset 
 
--help):
-\layout List
-\labelwidthstring 00.00.0000
+,
+\layout Standard
 
--
-\begin_inset ERT
-status Collapsed
+small / large
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+1.52 / 2.59 ms
 \end_inset 
-
--debug-extra
-\begin_inset LatexCommand \index{PIC14!Options!-\/-debug-extra}
-
-\end_inset 
-
- emit debug info in assembly output
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--no-pcode-opt
-\begin_inset LatexCommand \index{PIC14!Options!-\/-no-pcode-opt}
-
+1.53 / 2.62 ms
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- disable (slightly faulty) optimization on pCode
-\layout Subsection
-
-The library
-\layout Subsubsection
-
-error: missing definition for symbol 
-\begin_inset Quotes sld
-\end_inset 
+\layout Standard
 
-__gptrget1
-\begin_inset Quotes srd
+0.92 / 0.93 ms
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-The PIC14 port uses library routines to provide more complex operations
- like multiplication, division/modulus and (generic) pointer dereferencing.
- In order to add these routines to your project, you must link with PIC14's
-\family typewriter 
-libsdcc.lib
-\family default 
-.
- For single source file projects this is done automatically, more complex
- projects must add 
-\family typewriter 
-libsdcc.lib
-\family default 
- to the linker's arguments.
- Make sure you also add an include path for the library (using the -I switch
- to the linker)!
-\layout Subsubsection
-
-Processor mismatch in file 
-\begin_inset Quotes sld
-\end_inset 
-
-XXX
-\begin_inset Quotes srd
+0.45 / 0.45 ms
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-.
 \layout Standard
 
-This warning can usually be ignored due to the very good compatibility amongst
- 14 bit PIC
-\begin_inset LatexCommand \index{PIC14}
-
+0.46 / 0.46 ms
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- devices.
 \layout Standard
 
-You might also consider recompiling the library for your specific device
- by changing the ARCH=p16f877 (default target) entry in 
-\family typewriter 
-device/lib/pic/Makefile.in
-\family default 
- and 
-\family typewriter 
-device/lib/pic/Makefile
-\family default 
- to reflect your device.
- This might even improve performance for smaller devices as unneccesary
- BANKSELs migth be removed.
-\layout Subsection
-
-Known bugs
-\layout Subsubsection
+0.45 / 0.45 ms
+\end_inset 
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-initialized data
 \layout Standard
 
-Currently, data can only be initialized if it resides in the source file
- together with 
-\emph on 
-main()
-\emph default 
-.
- Data in other source files will silently 
-\series bold 
-not
-\series default 
- be initialized.
-\family typewriter 
-\size footnotesize 
-
-\begin_inset Marginal
+int speed
+\begin_inset Foot
 collapsed true
 
 \layout Standard
 
-
-\series bold 
-\SpecialChar ~
-!
-\end_inset 
-
-
-\layout Section
-\pagebreak_top 
-The PIC16
-\begin_inset LatexCommand \index{PIC16}
-
+Execution time of printf("%d", -12345); standard 8051 @ 22.1184 MHz, empty
+ putchar()
 \end_inset 
 
- port
+,
 \layout Standard
 
-The PIC16
-\begin_inset LatexCommand \index{PIC16}
-
-\end_inset 
-
- port is the portion of SDCC that is responsible to produce code for the
- Microchip
-\begin_inset LatexCommand \index{Microchip}
-
+small / large
 \end_inset 
-
-(TM) microcontrollers with 16 bit core.
- Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx.
- Currently supported devices are:
-\layout Standard
-\align center 
-
-\begin_inset  Tabular
-<lyxtabular version="3" rows="4" columns="6">
-<features>
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<row topline="true">
+</cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F242
+3.01 / 3.61 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -18072,7 +17924,7 @@ The PIC16
 
 \layout Standard
 
-18F248
+3.01 / 3.61 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -18080,23 +17932,23 @@ The PIC16
 
 \layout Standard
 
-18F252
+3.51 / 18.13 ms
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F258
+0.22 / 0.22 ms
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F442
+0.23 / 0.23 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -18104,67 +17956,63 @@ The PIC16
 
 \layout Standard
 
-18F448
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+0.25 / 0.25 ms
+\begin_inset Foot
+collapsed true
 
 \layout Standard
 
-18F452
+printf_tiny integer speed is data dependent, worst case is 0.33 ms
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-18F458
 \end_inset 
 </cell>
+</row>
+<row bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F1220
+long speed
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+Execution time of printf("%ld", -123456789); standard 8051 @ 22.1184 MHz,
+ empty putchar()
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+,
 \layout Standard
 
-18F2220
+small / large
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F2550
+5.37 / 6.31 ms
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F4331
+5.37 / 6.31 ms
 \end_inset 
 </cell>
-</row>
-<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F4455
+8.71 / 40.65 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -18172,7 +18020,7 @@ The PIC16
 
 \layout Standard
 
-18F6520
+0.40 / 0.40 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -18180,7 +18028,7 @@ The PIC16
 
 \layout Standard
 
-18F6620
+0.40 / 0.40 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -18188,33 +18036,38 @@ The PIC16
 
 \layout Standard
 
-18F6680
+-
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F6720
+float speed
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+Execution time of printf("%.3f", -12345.678); standard 8051 @ 22.1184 MHz,
+ empty putchar()
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+,
 \layout Standard
 
-18F8520
+small / large
 \end_inset 
 </cell>
-</row>
-<row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-18F8620
+-
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -18222,7 +18075,7 @@ The PIC16
 
 \layout Standard
 
-18F8680
+7.49 / 22.47 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -18230,21 +18083,23 @@ The PIC16
 
 \layout Standard
 
-18F8720
+-
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+-
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+1.04 / 1.04 ms
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -18252,6 +18107,7 @@ The PIC16
 
 \layout Standard
 
+-
 \end_inset 
 </cell>
 </row>
@@ -18260,202 +18116,200 @@ The PIC16
 \end_inset 
 
 
-\layout Subsection
+\layout Subsubsection
 
-Global Options
-\layout Standard
+<malloc.h>
+\begin_inset LatexCommand \index{malloc.h}
 
-PIC16 port supports the standard command line arguments as supposed, with
- the exception of certain cases that will be mentioned in the following
- list:
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
--
-\begin_inset ERT
-status Collapsed
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--callee-saves
-\begin_inset LatexCommand \index{PIC16!Options!-\/-callee-saves}
+As of SDCC 2.6.2 you no longer need to call an initialization routine before
+ using dynamic memory allocation
+\begin_inset LatexCommand \index{dynamic memory allocation (malloc)}
 
 \end_inset 
 
- See -
-\begin_inset ERT
-status Collapsed
+ and a default heap
+\begin_inset LatexCommand \index{heap (malloc)}
+
+\end_inset 
+
+ space of 1024 bytes is provided for malloc to allocate memory from.
+ If you need a different heap size you need to recompile _heap.c with the
+ required size defined in HEAP_SIZE.
+ It is recommended to make a copy of this file into your project directory
+ and compile it there with:
+\layout Verse
 
+
+\family typewriter 
+sdcc -c _heap.c -D HEAD_SIZE=2048
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+And then link it with:
+\layout Verse
 
--all-callee-saves
-\layout List
-\labelwidthstring 00.00.0000
 
--
-\begin_inset ERT
-status Collapsed
+\family typewriter 
+sdcc main.rel _heap.rel
+\layout Subsection
+
+Math functions (sinf, powf, sqrtf etc.)
+\layout Subsubsection
 
+<math.h>
 \layout Standard
 
-\backslash 
-/
+See definitions in file <math.h>.
+\layout Subsection
+
+Other libraries
+\layout Standard
+
+Libraries
+\begin_inset LatexCommand \index{Libraries}
+
 \end_inset 
 
--all-callee-saves
-\begin_inset LatexCommand \index{PIC16!Options!-\/-all-callee-saves}
+ 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 
 
- All function arguments are passed on stack by default.
  
 \emph on 
-There is no need to specify this in the command line.
-\layout List
-\labelwidthstring 00.00.0000
+LGPL
+\emph default 
+.
+\layout Standard
 
--
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset Note
+collapsed true
 
-\backslash 
-/
-\end_inset 
+\layout Standard
 
--fommit-frame-pointer
-\begin_inset LatexCommand \index{PIC16!Options!-\/-fommit-frame-pointer}
+license statements for the libraries are missing.
+ sdcc/device/lib/ser_ir.c
+\layout Standard
 
+or _decdptr f.e.
+ come with a GPL (as opposed to LGPL) License - this will not be liberal
+ enough for many embedded programmers.
 \end_inset 
 
- Frame pointer will be omitted when the function uses no local variables.
-\layout Subsection
 
-Port Specific Options
-\begin_inset LatexCommand \index{Options PIC16}
+\layout Standard
 
+If you have ported some library or want to share experience about some code
+ which f.e.
+ falls into any of these categories Busses (I
+\begin_inset Formula $^{\textrm{2}}$
 \end_inset 
 
+C, CAN, Ethernet, Profibus, Modbus, USB, SPI, JTAG ...), Media (IDE, Memory
+ cards, eeprom, flash...), En-/Decryption, Remote debugging, Realtime kernel,
+ Keyboard, LCD, RTC, FPGA, PID then the sdcc-user mailing list 
+\begin_inset LatexCommand \url{http://sourceforge.net/mail/?group_id=599}
+
+\end_inset 
 
+\SpecialChar ~
+would certainly like to hear about it.
 \layout Standard
+\added_space_bottom bigskip 
+Programmers coding for embedded systems are not especially famous for being
+ enthusiastic, so don't expect a big hurray but as the mailing list is searchabl
+e these references are very valuable.
+ Let's help to create a climate where information is shared.
+\layout Section
 
-The port specific options appear after the global options in the sdcc --help
- output.
-\layout Subsubsection
+Memory Models
+\layout Subsection
 
-General Options
-\layout Standard
+MCS51 Memory Models
+\begin_inset LatexCommand \index{Memory model}
 
-General options enable certain port features and optimizations.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
--
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset LatexCommand \index{MCS51 memory model}
 
-\backslash 
-/
 \end_inset 
 
--stack-model=[model] Used in conjuction with the command above.
- Defines the stack model to be used, valid stack models are : 
-\begin_deeper 
-\layout List
-\labelwidthstring 00.00.0000
-
 
-\emph on 
-small
-\emph default 
- Selects small stack model.
- 8 bit stack and frame pointers.
- Supports 256 bytes stack size.
-\layout List
-\labelwidthstring 00.00.0000
+\layout Subsubsection
 
+Small, Medium and Large
+\layout Standard
 
-\emph on 
+SDCC allows three memory models for MCS51 code, 
+\shape slanted 
+small, medium
+\shape default 
+ and 
+\shape slanted 
 large
+\shape default 
+.
+ Modules compiled with different memory models should 
+\emph on 
+never
 \emph default 
Selects large stack model.
- 16 bit stack and frame pointers.
Supports 65536 bytes stack size.
-\end_deeper 
-\layout List
-\labelwidthstring 00.00.0000
be combined together or the results would be unpredictable.
+ The library routines supplied with the compiler are compiled as small,
medium and large.
+ The compiled library modules are contained in separate directories as small,
+ medium and large so that you can link to the appropriate set.
+\layout Standard
 
--
-\begin_inset ERT
-status Collapsed
+When the medium or large model is used all variables declared without a
+ storage class will be allocated into the external ram, this includes all
+ parameters and local variables (for non-reentrant
+\begin_inset LatexCommand \index{reentrant}
+
+\end_inset 
 
+ functions).
+ When the small model is used variables without storage class are allocated
+ in the internal ram.
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+Judicious usage of the processor specific storage classes
+\begin_inset LatexCommand \index{Storage class}
 
--preplace-udata-with=[kword] Replaces the default udata keyword for allocating
- unitialized data variables with [kword].
- Valid keywords are: "udata_acs", "udata_shr", "udata_ovr".
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
--
-\begin_inset ERT
-status Collapsed
+ and the 'reentrant' function type will yield much more efficient code,
+ than using the large model.
+ Several optimizations are disabled when the program is compiled using the
+ large model, it is therefore recommended that the small model be used unless
+ absolutely required.
+\layout Subsubsection
 
-\layout Standard
+External Stack
+\begin_inset LatexCommand \label{sub:External-Stack}
 
-\backslash 
-/
 \end_inset 
 
--ivt-loc <nnnn> positions the Interrupt Vector Table at location <nnnn>.
- Useful for bootloaders.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset LatexCommand \index{stack}
 
-\backslash 
-/
 \end_inset 
 
--asm= sets the full path and name of an external assembler to call.
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset LatexCommand \index{External stack (mcs51)}
 
-\backslash 
-/
 \end_inset 
 
--link= sets the full path and name of an external linker to call.
-\layout List
-\labelwidthstring 00.00.0000
 
--
+\layout Standard
+
+The external stack (-
 \begin_inset ERT
 status Collapsed
 
@@ -18465,20 +18319,20 @@ status Collapsed
 /
 \end_inset 
 
--mplab-comp MPLAB
-\begin_inset LatexCommand \index{PIC16!MPLAB}
+-xstack option
+\begin_inset LatexCommand \index{-\/-xstack}
 
 \end_inset 
 
- compatibility option.
- Currently only suppresses special gpasm directives.
-\layout Subsubsection
+) is located in pdata
+\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
 
-Optimization Options
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
--
+ memory (usually at the start of the external ram segment) and uses all
+ unused space in pdata (max.
+ 256 bytes).
+ When -
 \begin_inset ERT
 status Collapsed
 
@@ -18488,11 +18342,15 @@ status Collapsed
 /
 \end_inset 
 
--optimize-goto Try to use (conditional) BRA instead of GOTO
-\layout List
-\labelwidthstring 00.00.0000
+-xstack option is used to compile the program, the parameters and local
+ variables
+\begin_inset LatexCommand \index{local variables}
 
--
+\end_inset 
+
+ of all reentrant functions are allocated in this area.
+ This option is provided for programs with large stack space requirements.
+ When used with the -
 \begin_inset ERT
 status Collapsed
 
@@ -18502,79 +18360,84 @@ status Collapsed
 /
 \end_inset 
 
--optimize-cmp Try to optimize some compares.
-\layout List
-\labelwidthstring 00.00.0000
+-stack-auto
+\begin_inset LatexCommand \index{-\/-stack-auto}
 
--
-\begin_inset ERT
-status Collapsed
+\end_inset 
 
+ option, all parameters and local variables are allocated on the external
+ stack (note: support libraries will need to be recompiled with the same
+ options.
+ There is a predefined target in the library makefile).
 \layout Standard
 
-\backslash 
-/
+The compiler outputs the higher order address byte of the external ram segment
+ into port P2
+\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
+
 \end_inset 
 
--optimize-df Analyze the dataflow of the generated code and improve it.
-\layout List
-\labelwidthstring 00.00.0000
+ (see also section 
+\begin_inset LatexCommand \ref{sub:MCS51-variants}
 
--
-\begin_inset ERT
-status Collapsed
+\end_inset 
 
-\layout Standard
+), therefore when using the External Stack option, this port 
+\emph on 
+may not
+\emph default 
+ be used by the application program.
+\layout Subsection
+
+DS390 Memory Model
+\begin_inset LatexCommand \index{Memory model}
 
-\backslash 
-/
 \end_inset 
 
--obanksel=nn Set optimization level for inserting BANKSELs.
-\newline 
 
-\begin_deeper 
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand \index{DS390 memory model}
 
-0 no optimization
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
-1 checks previous used register and if it is the same then does not emit
- BANKSEL, accounts only for labels.
-\layout List
-\labelwidthstring 00.00.0000
 
-2 tries to check the location of (even different) symbols and removes BANKSELs
- if they are in the same bank.
-\newline 
+\layout Standard
 
-\emph on 
-Important: There might be problems if the linker script has data sections
- across bank borders!
-\end_deeper 
-\layout Subsubsection
+The only model supported is Flat 24
+\begin_inset LatexCommand \index{Flat 24 (DS390 memory model)}
 
-Linking Options
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
--
-\begin_inset ERT
-status Collapsed
+.
+ This generates code for the 24 bit contiguous addressing mode of the Dallas
+ DS80C390 part.
+ In this mode, up to four meg of external RAM or code space can be directly
+ addressed.
+ See the data sheets at www.dalsemi.com for further information on this part.
+\newline 
 
-\layout Standard
+\newline 
+Note that the compiler does not generate any code to place the processor
+ into 24 bitmode (although 
+\emph on 
+tinibios
+\emph default 
+ in the ds390 libraries will do that for you).
+ If you don't use 
+\emph on 
+tinibios
+\emph default 
+
+\begin_inset LatexCommand \index{Tinibios (DS390)}
 
-\backslash 
-/
 \end_inset 
 
--nodefaultlibs do not link default libraries when linking
-\layout List
-\labelwidthstring 00.00.0000
+, the boot loader or similar code must ensure that the processor is in 24
+ bit contiguous addressing mode before calling the SDCC startup code.
+\newline 
 
+\newline 
+Like the 
+\emph on 
 -
 \begin_inset ERT
 status Collapsed
@@ -18585,11 +18448,15 @@ status Collapsed
 /
 \end_inset 
 
--no-crt Don't link the default run-time modules
-\layout List
-\labelwidthstring 00.00.0000
+-model-large
+\emph default 
+ option, variables will by default be placed into the XDATA segment.
+\newline 
 
--
+\newline 
+Segments may be placed anywhere in the 4 meg address space using the usual
+ -
 \begin_inset ERT
 status Collapsed
 
@@ -18599,91 +18466,98 @@ status Collapsed
 /
 \end_inset 
 
--use-crt= Use a custom run-time module instead of the defaults.
-\layout Subsubsection
+-*-loc options.
+ Note that if any segments are located above 64K, the -r flag must be passed
+ to the linker to generate the proper segment relocations, and the Intel
+ HEX output format must be used.
+ The -r flag can be passed to the linker by using the option 
+\emph on 
+-Wl-r
+\emph default 
+ on the SDCC command line.
+ However, currently the linker can not handle code segments > 64k.
+\layout Section
 
-Debugging Options
-\layout Standard
+Pragmas
+\begin_inset LatexCommand \label{sec:Pragmas}
 
-Debugging options enable extra debugging information in the output files.
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
--
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\begin_inset LatexCommand \index{Pragmas}
 
-\backslash 
-/
 \end_inset 
 
--debug-xtra Similar to -
-\begin_inset ERT
-status Collapsed
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+SDCC supports the following #pragma directives:
+\layout Itemize
 
--debug
-\begin_inset LatexCommand \index{-\/-debug}
+
+\series bold 
+save
+\series default 
+
+\begin_inset LatexCommand \index{\#pragma save}
 
 \end_inset 
 
-, but dumps more information.
-\layout List
-\labelwidthstring 00.00.0000
+ - this will save most current options to the save/restore stack.
+ See #pragma\SpecialChar ~
+restore.
+\layout Itemize
 
--
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\series bold 
+restore
+\series default 
+
+\begin_inset LatexCommand \index{\#pragma restore}
 
-\backslash 
-/
 \end_inset 
 
--debug-ralloc Force register allocator to dump <source>.d file with debugging
- information.
- <source> is the name of the file compiled.
-\layout List
-\labelwidthstring 00.00.0000
+ - will restore saved options from the last save.
+ saves & restores can be nested.
+ SDCC uses a save/restore stack: save pushes current options to the stack,
+ restore pulls current options from the stack.
+ See #pragma\SpecialChar ~
+save.
+\newline 
 
--
-\begin_inset ERT
-status Collapsed
+\layout Itemize
 
-\layout Standard
 
-\backslash 
-/
-\end_inse
+\series bold 
+callee_saves
+\series defaul
 
--pcode-verbose Enable pcode debugging information in translation.
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand \index{\#pragma callee\_saves}
 
--
-\begin_inset ERT
-status Collapsed
+\end_inset 
 
-\layout Standard
 
-\backslash 
-/
+\begin_inset LatexCommand \index{function prologue}
+
 \end_inset 
 
--denable-peeps Force the usage of peepholes.
- Use with care.
-\layout List
-\labelwidthstring 00.00.0000
+ function1[,function2[,function3...]] - The compiler by default uses a caller
+ saves convention for register saving across function calls, however this
+ can cause unnecessary register pushing & popping
+\begin_inset LatexCommand \index{push/pop}
 
--
+\end_inset 
+
+ when calling small functions from larger functions.
+ This option can be used to switch off the register saving convention for
+ the function names specified.
+ The compiler will not save registers when calling these functions, extra
+ code need to be manually inserted at the entry & 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
 
@@ -18693,679 +18567,718 @@ status Collapsed
 /
 \end_inset 
 
--gstack Trace push/pops for stack pointer overflow
-\layout List
-\labelwidthstring 00.00.0000
-
--
-\begin_inset ERT
-status Collapsed
-
-\layout Standard
+-callee-saves command line option is used, the function names specified
+ in #pragma\SpecialChar ~
+callee_saves
+\begin_inset LatexCommand \index{\#pragma callee\_saves}
 
-\backslash 
-/
 \end_inset 
 
--call-tree dump call tree in .calltree file
-\layout Subsection
+ is appended to the list of functions specified in the command line.
+\layout Itemize
 
-Enviromental Variables
-\layout Standard
 
-There is a number of enviromental variables that can be used when running
- SDCC to enable certain optimizations or force a specific program behaviour.
- these variables are primarily for debugging purposes so they can be enabled/dis
-abled at will.
-\layout Standard
+\series bold 
+exclude
+\series default 
 
-Currently there is only two such variables available:
-\layout List
-\labelwidthstring 00.00.0000
+\begin_inset LatexCommand \index{\#pragma exclude}
 
-OPTIMIZE_BITFIELD_POINTER_GET when this variable exists reading of structure
- bitfields is optimized by directly loading FSR0 with the address of the
- bitfield structure.
- Normally SDCC will cast the bitfield structure to a bitfield pointer and
- then load FSR0.
- This step saves data ram and code space for functions that perform heavy
- use of bitfields.
- (ie.
- 80 bytes of code space are saved when compiling malloc.c with this option).
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
-NO_REG_OPT do not perform pCode registers optimization.
- This should be used for debugging purposes.
- In some where bugs in the pcode optimizer are found, users can benefit
- from temporarily disabling the optimizer until the bug is fixed.
-\layout Subsection
+ none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation
+ of pairs of push/pop
+\begin_inset LatexCommand \index{push/pop}
 
-Preprocessor Macros
-\layout Standard
+\end_inset 
 
-PIC16
-\begin_inset LatexCommand \index{PIC16}
+ instructions in 
+\emph on 
+I
+\emph default 
+nterrupt
+\begin_inset LatexCommand \index{interrupt}
 
 \end_inset 
 
- port defines the following preprocessor macros while translating a source.
-\layout Standard
-\align center 
+\emph on 
+S
+\emph default 
+ervice 
+\emph on 
+R
+\emph default 
+outines.
+ The directive should be placed immediately before the ISR function definition
+ and it affects ALL ISR functions following it.
+ To enable the normal register saving for ISR functions use #pragma\SpecialChar ~
+exclude\SpecialChar ~
+none
+\begin_inset LatexCommand \index{\#pragma exclude}
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="6" 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
+\end_inset 
 
-\layout Standard
+.
+ See also the related keyword _naked
+\begin_inset LatexCommand \index{\_naked}
 
-Macro
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-Description
+\begin_inset LatexCommand \index{\_\_naked}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+\layout Itemize
 
-SDCC_pic16
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\series bold 
+less_pedantic
+\series default 
+
+\begin_inset LatexCommand \index{\#pragma less\_pedantic}
 
-Port identification
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ - the compiler will not warn you anymore for obvious mistakes, you'r on
+ your own now ;-(
+\layout Itemize
 
-_
-\begin_inset ERT
-status Collapsed
 
-\layout Standard
+\series bold 
+disable_warning
+\series default 
+ <nnnn>
+\begin_inset LatexCommand \index{\#pragma disable\_warning}
 
-\backslash 
-/
 \end_inset 
 
-_pic16
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+ - the compiler will not warn you anymore about warning number <nnnn>.
+\layout Itemize
 
-\layout Standard
 
-Port identification (same as above)
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\series bold 
+nogcse
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma nogcse}
 
-pic18fxxxx
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-MCU Identification.
-\emph on 
-xxxx
-\emph default 
- is the microcontrol identification number, i.e.
- 452, 6620, etc
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+ - will stop global common subexpression elimination.
+\layout Itemize
 
-\layout Standard
 
-_
-\begin_inset ERT
-status Collapsed
+\series bold 
+noinduction
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma noinduction}
 
-\backslash 
-/
 \end_inset 
 
-_18Fxxxx
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+ - will stop loop induction optimizations.
+\layout Itemize
 
-\layout Standard
 
-MCU Identification (same as above)
-\end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\series bold 
+noinvariant
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma noinvariant}
 
-STACK_MODEL_nnn
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ - will not do loop invariant optimizations.
+ For more details see Loop Invariants in section
+\begin_inset LatexCommand \ref{sub:Loop-Optimizations}
 
-nnn = SMALL or LARGE respectively according to the stack model used
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
 
-\end_inset 
+.
+\layout Itemize
 
 
-\layout Standard
+\series bold 
+noiv
+\series default 
 
-In addition the following macros are defined when calling assembler:
-\layout Standard
-\align center 
+\begin_inset LatexCommand \index{\#pragma noiv}
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="4" 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
+\end_inset 
 
-\layout Standard
+ - Do not generate interrupt
+\begin_inset LatexCommand \index{interrupt}
 
-Macro
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ vector table
+\begin_inset LatexCommand \index{interrupt vector table}
 
-Description
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ entries for all ISR functions defined after the pragma.
+ This is useful in cases where the interrupt vector table must be defined
+ manually, or when there is a secondary, manually defined interrupt vector
+ table (e.g.
+ for the autovector feature of the Cypress EZ-USB FX2).
+ More elegantly this can be achieved by obmitting the optional interrupt
+ number after the interrupt keyword, see section 
+\begin_inset LatexCommand \ref{sub:Interrupt-Service-Routines}
 
-__18Fxxxx
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-MCU Identification.
-\emph on 
-xxxx
-\emph default 
- is the microcontrol identification number, i.e.
- 452, 6620, etc
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\SpecialChar ~
+about interrupts.
+\layout Itemize
 
-\layout Standard
 
-SDCC_MODEL_nnn
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\series bold 
+nojtbound
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma nojtbound}
 
-nnn = SMALL or LARGE respectively according to the memory model used for
- SDCC
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ - will not generate code for boundary value checking, when switch statements
+ are turned into jump-tables (dangerous).
+ For more details see section 
+\begin_inset LatexCommand \ref{sub:'switch'-Statements}
 
-STACK_MODEL_nnn
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+\layout Itemize
 
-nnn = SMALL or LARGE respectively according to the stack model used
-\end_inset 
-</cell>
-</row>
-</lyxtabular>
+
+\series bold 
+noloopreverse
+\series default 
+
+\begin_inset LatexCommand \index{\#pragma noloopreverse}
 
 \end_inset 
 
+ - Will not do loop reversal optimization
+\layout Itemize
 
-\layout Subsection
 
-Directories
-\layout Standard
+\series bold 
+nooverlay
+\series default 
 
-PIC16
-\begin_inset LatexCommand \index{PIC16}
+\begin_inset LatexCommand \index{\#pragma nooverlay}
 
 \end_inset 
 
- port uses the following directories for searching header files and libraries.
-\layout Standard
-\align center 
-
-\begin_inset  Tabular
-<lyxtabular version="3" rows="3" columns="4">
-<features>
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<column alignment="center" valignment="top" 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
+ - the compiler will not overlay the parameters and local variables of a
+ function.
+\layout Itemize
 
-\layout Standard
 
-Directory
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\series bold 
+stackauto
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma stackauto}
 
-Description
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+- See option -
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-Target
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-stack-auto
+\begin_inset LatexCommand \index{-\/-stack-auto}
 
-Command prefix
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ and section 
+\begin_inset LatexCommand \ref{sec:Parameters-and-Local-Variables}
 
-PREFIX/sdcc/include/pic16
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ Parameters and Local Variables.
+\layout Itemize
 
-PIC16 specific headers
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\series bold 
+opt_code_speed
+\series default 
+\begin_inset LatexCommand \index{\#pragma opt\_code\_speed}
 
-Compiler
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+- The compiler will optimize code generation towards fast code, possibly
+ at the expense of code size.
+ Currently this has little effect.
+\layout Itemize
 
--I
-\end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\series bold 
+opt_code_size
+\series default 
+\begin_inset LatexCommand \index{\#pragma opt\_code\_size}
 
-PREFIX/sdcc/lib/pic16
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+- The compiler will optimize code generation towards compact code, possibly
+ at the expense of code speed.
+ Currently this has little effect.
+\layout Itemize
 
-PIC16 specific libraries
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\series bold 
+opt_code_balanced
+\series default 
+\begin_inset LatexCommand \index{\#pragma opt\_code\_balanced}
 
-Linker
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+- The compiler will attempt to generate code that is both compact and fast,
+ as long as meeting one goal is not a detriment to the other (this is the
+ default).
+\layout Itemize
 
--L
-\end_inset 
-</cell>
-</row>
-</lyxtabular>
+
+\series bold 
+std_sdcc89
+\series default 
+\begin_inset LatexCommand \index{\#pragma std\_sdcc89}
 
 \end_inset 
 
+- Generally follow the C89 standard, but allow SDCC features that conflict
+ with the standard (default).
+\layout Itemize
 
-\layout Subsection
 
-Pragmas
-\begin_inset LatexCommand \label{sub:PIC16_Pragmas}
+\series bold 
+std_c89
+\series default 
+\begin_inset LatexCommand \index{\#pragma std\_c89}
 
 \end_inset 
 
+- Follow the C89 standard and disable SDCC features that conflict with the
+ standard.
+\layout Itemize
 
-\layout Standard
 
-PIC16
-\begin_inset LatexCommand \index{PIC16}
+\series bold 
+std_sdcc99
+\series default 
+\begin_inset LatexCommand \index{\#pragma std\_sdcc99}
 
 \end_inset 
 
- port currently supports the following pragmas:
-\layout List
-\labelwidthstring 00.00.0000
-
-stack
-\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma stack}
+- Generally follow the C99 standard, but allow SDCC features that conflict
+ with the standard (incomplete support).
+\layout Itemize
 
-\end_inset 
 
- pragma stack
-\begin_inset LatexCommand \index{PIC16!stack}
+\series bold 
+std_c99
+\series default 
+\begin_inset LatexCommand \index{\#pragma std\_c99}
 
 \end_inset 
 
- forces the code generator to initialize the stack & frame pointers at a
- specific address.
- This is an adhoc solution for cases where no STACK directive is available
- in the linker script or gplink is not instructed to create a stack section.
-\newline 
-The stack pragma should be used only once in a project.
- Multiple pragmas may result in indeterminate behaviour of the program.
-\begin_inset Foot
-collapsed false
+- Follow the C99 standard and disable SDCC features that conflict with the
+ standard (incomplete support).
+\layout Itemize
 
-\layout Standard
 
-The old format (ie.
- #pragma stack 0x5ff) is deprecated and will cause the stack pointer to
- cross page boundaries (or even exceed the available data RAM) and crash
- the program.
- Make sure that stack does not cross page boundaries when using the SMALL
- stack model.
-\end_inset 
+\series bold 
+codeseg
+\series default 
+ <name>
+\begin_inset LatexCommand \index{\#pragma codeseg}
 
+\end_inset 
 
-\newline 
-The format is as follows:
-\layout LyX-Code
+- Use this name (max.
+ 8 characters) for the code segment.
+ See option -
+\begin_inset ERT
+status Collapsed
 
-#pragma stack bottom_address [stack_size]
 \layout Standard
 
+\backslash 
+/
+\end_inset 
 
-\emph on 
-bottom_address
-\emph default 
- is the lower bound of the stack section.
- The stack pointer initially will point at address (bottom_address+stack_size-1).
-\layout LyX-Code
+-codeseg.
+\layout Itemize
 
-Example:
-\layout LyX-Code
 
-\layout LyX-Code
+\series bold 
+constseg
+\series default 
+ <name>
+\begin_inset LatexCommand \index{\#pragma constseg}
 
-/* initializes stack of 100 bytes at RAM address 0x200 */
-\layout LyX-Code
+\end_inset 
+
+- Use this name (max.
+ 8 characters) for the const segment.
+ See option -
+\begin_inset ERT
+status Collapsed
 
-#pragma stack 0x200 100
 \layout Standard
 
-If the stack_size field is omitted then a stack is created with the default
- size of 64.
- This size might be enough for most programs, but its not enough for operations
- with deep function nesting or excessive stack usage.
-\layout List
-\labelwidthstring 00.00.0000
+\backslash 
+/
+\end_inset 
 
-wparam 
-\emph on 
-This pragma is deprecated.
- Its use will cause a warning message to be issued.
-\emph default 
+-constseg.
+\layout Standard
 
-\newline 
+The preprocessor SDCPP
+\begin_inset LatexCommand \index{sdcpp (preprocessor)}
 
-\layout List
-\labelwidthstring 00.00.0000
+\end_inset 
 
-code
-\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma code}
+ supports the following #pragma directives:
+\layout Itemize
+
+
+\series bold 
+pedantic_parse_number
+\series default 
+
+\begin_inset LatexCommand \index{\#pragma pedantic\_parse\_number}
 
 \end_inset 
 
- place a function symbol at static FLASH address
-\layout LyX-Code
+ (+ | -) - Pedantic parse numbers so that situations like 0xfe-LO_B(3) are
+ parsed properly and the macro LO_B(3) gets expanded.
+ Default is off.
+ Below is an example on how to use this pragma.
 
-Example:
-\layout LyX-Code
+\emph on 
+ Note: this functionality is not in conformance with standard!
+\layout Verse
 
-\layout LyX-Code
 
-/* place function test_func at 0x4000 */
-\layout LyX-Code
+\family typewriter 
+#pragma pedantic_parse_number +
+\begin_inset LatexCommand \index{\#pragma pedantic\_parse\_number}
 
-#pragma code test_func 0x4000
-\layout LyX-Code
+\end_inset 
 
-\layout List
-\labelwidthstring 00.00.0000
 
-library instructs the linker to use a library module.
 \newline 
-Usage:
-\layout LyX-Code
 
-#pragma library module_name
-\layout Standard
+\newline 
+#define LO_B(x) ((x) & 0xff)
+\newline 
 
+\newline 
+unsigned char foo(void)
+\newline 
+{
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+unsigned char c=0xfe-LO_B(3);
+\newline 
 
-\emph on 
-module_name
-\emph default 
- can be any library or object file (including its path).
- Note that there are four reserved keywords which have special meaning.
- These are:
-\layout Standard
-\align center 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+return c;
+\newline 
+}
+\newline 
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="6" columns="3">
-<features>
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="block" valignment="top" leftline="true" width="20page%">
-<column alignment="left" 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 Itemize
 
-\layout Standard
 
-Keyword
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\series bold 
+preproc_asm
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma preproc\_asm}
 
-Description
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ (+ | -) - switch _asm _endasm block preprocessing on / off.
+ Default is on.
+ You use this prama to define multilines of assembly code.
+ This will prevent the preprocessor from changing the formating required
+ by assembly code.
+ Below is an example on how to use this pragma.
+\layout Verse
+
+
+\family typewriter 
+#pragma preproc_asm -
+\begin_inset LatexCommand \index{\#pragma preproc\_asm}
 
-Module to link
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+
+\newline 
+#define MYDELAY _asm
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+nop ;my assembly comment...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+nop
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+nop
+\newline 
+_endasm
+\newline 
+#pragma preproc_asm +
+\newline 
+
+\newline 
+void foo (void) 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ MYDELAY;
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ ...
+\newline 
+} 
+\newline 
+
+\layout Itemize
 
 
 \series bold 
-ignore
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+sdcc_hash
+\series default 
 
-\layout Standard
+\begin_inset LatexCommand \index{\#pragma sdcc\_hash}
 
-ignore all library pragmas
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ (+ | -) - Allow "naked" hash in macro definition, for example:
+\newline 
 
+\family typewriter 
+#define DIR_LO(x) #(x & 0xff)
+\family default 
 
-\emph on 
-(none)
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\newline 
+Default is off.
+ Below is an example on how to use this pragma.
+\layout Verse
 
-\layout Standard
 
+\family typewriter 
+#pragma preproc_asm +
+\newline 
+#pragma sdcc_hash +
+\begin_inset LatexCommand \index{\#pragma sdcc\_hash}
 
-\series bold 
-c
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-link the C library
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\newline 
+
+\newline 
+#define ROMCALL(x) 
+\backslash 
+
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov R6_B3, #(x & 0xff) 
+\backslash 
+
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mov R7_B3, #((x >> 8) & 0xff) 
+\backslash 
+
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+lcall __romcall
+\newline 
+
+\newline 
+...
+\newline 
+_asm
+\newline 
+ROMCALL(72)
+\newline 
+_endasm;
+\newline 
+...
+\newline 
 
 \layout Standard
 
+The pragma's are intended to be used to turn-on or off certain optimizations
+ which might cause the compiler to generate extra stack / data space to
+ store compiler generated temporary variables.
+ This usually happens in large functions.
+ Pragma directives should be used as shown in the following example, they
+ are used to control options & optimizations for a given function; pragmas
+ should be placed before and/or after a function, placing pragma's inside
+ a function body could have unpredictable results.
+\layout Verse
+
+
+\family typewriter 
+#pragma save
+\begin_inset LatexCommand \index{\#pragma save}
+
+\end_inset 
+
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* save the current settings */ 
+\newline 
+#pragma nogcse
+\begin_inset LatexCommand \index{\#pragma nogcse}
+
+\end_inset 
+
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+/* turnoff global subexpression elimination */ 
+\newline 
+#pragma noinduction
+\begin_inset LatexCommand \index{\#pragma noinduction}
+
+\end_inset 
+
+ /* turn off induction optimizations */ 
+\newline 
+int foo () 
+\newline 
+{ 
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ /* large code */ 
+\newline 
+\SpecialChar ~
+ \SpecialChar ~
+ ...
+\newline 
+} 
+\newline 
+#pragma restore
+\begin_inset LatexCommand \index{\#pragma restore}
 
-\emph on 
-libc18f
-\emph default 
-.lib
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ /* turn the optimizations back on */
 \layout Standard
 
+The compiler will generate a warning message when extra space is allocated.
+ It is strongly recommended that the save and restore pragma's be used when
+ changing options for a function.
+\newline 
+
+\newline 
+
+\newline 
+
+\layout Section
+
+Defines Created by the Compiler
+\layout Standard
+
+The compiler creates the following #defines
+\begin_inset LatexCommand \index{\#defines}
 
-\series bold 
-math
 \end_inset 
-</cell>
+
+
+\begin_inset LatexCommand \index{Defines created by the compiler}
+
+\end_inset 
+
+:
+\newline 
+
+\layout Standard
+
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="11" columns="2">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="3in">
+<column alignment="left" valignment="top" leftline="true" rightline="true" width="3in">
+<row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-link the Math libarary
+
+\series bold 
+#define
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -19374,10 +19287,8 @@ link the Math libarary
 \layout Standard
 
 
-\emph on 
-libm18f
-\emph default 
-.lib
+\series bold 
+Description
 \end_inset 
 </cell>
 </row>
@@ -19387,17 +19298,12 @@ libm18f
 
 \layout Standard
 
+SDCC
+\begin_inset LatexCommand \index{SDCC}
 
-\series bold 
-io
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
-
-link the I/O library
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -19405,31 +19311,34 @@ link the I/O library
 
 \layout Standard
 
-
-\emph on 
-libio18f*
-\emph default 
-.lib
+Always defined.
+ Since version 2.5.6 the version number as an int (ex.
+ 256)
 \end_inset 
 </cell>
 </row>
-<row topline="true" bottomline="true">
+<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+SDCC_mcs51
+\begin_inset LatexCommand \index{SDCC\_mcs51}
 
-\series bold 
-debug
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ or SDCC_ds390
+\begin_inset LatexCommand \index{SDCC\_ds390}
 
-link the debug library
+\end_inset 
+
+ or SDCC_z80
+\begin_inset LatexCommand \index{SDCC\_z80}
+
+\end_inset 
+
+, etc.
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -19437,303 +19346,246 @@ link the debug library
 
 \layout Standard
 
-
-\emph on 
-libdebug
-\emph default 
-.lib
+depending on the model used (e.g.: -mds390)
 \end_inset 
 </cell>
 </row>
-</lyxtabular>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\end_inset 
+\layout Standard
 
+__mcs51
+\begin_inset LatexCommand \index{\_\_mcs51}
 
-\newline 
-* is the device number, i.e.
- 452 for PIC18F452 MCU.
-\layout Standard
+\end_inset 
 
-This feature allows for linking with specific libraries withoug having to
- explicit name them in the command line.
- Note that the 
-\noun on 
-ignore
-\noun default 
- keyword will reject all modules specified by the library pragma.
-\layout List
-\labelwidthstring 00.00.0000
+, __ds390
+\begin_inset LatexCommand \index{\_\_ds390}
 
-udata pragma udata instructs the compiler to emit code so that linker will
- place a variable at a specific memory bank
-\layout LyX-Code
+\end_inset 
 
-Example:
-\layout LyX-Code
+, __hc08
+\begin_inset LatexCommand \index{\_\_hc08}
 
-\layout LyX-Code
+\end_inset 
 
-/* places variable foo at bank2 */
-\layout LyX-Code
+, __z80
+\begin_inset LatexCommand \index{\_\_z80}
 
-#pragma udata bank2 foo
-\layout LyX-Code
+\end_inset 
+
+, etc
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-char foo;
 \layout Standard
 
-In order for this pragma to work extra SECTION directives should be added
- in the .lkr script.
- In the following example a sample .lkr file is shown:
-\layout LyX-Code
-
-\layout LyX-Code
+depending on the model used (e.g.
+ -mz80)
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-// Sample linker script for the PIC18F452 processor
-\layout LyX-Code
+\layout Standard
 
-LIBPATH .
-\layout LyX-Code
+SDCC_STACK_AUTO
+\begin_inset LatexCommand \index{SDCC\_STACK\_AUTO}
 
-CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
-\layout LyX-Code
+\end_inset 
 
-CODEPAGE   NAME=page       START=0x2A           END=0x7FFF
-\layout LyX-Code
 
-CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
-\layout LyX-Code
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
-\layout LyX-Code
+\layout Standard
 
-CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
-\layout LyX-Code
+when 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
-CODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       PROTECTED
-\layout LyX-Code
+\layout Standard
 
-ACCESSBANK NAME=accessram  START=0x0            END=0x7F
-\layout LyX-Code
+\backslash 
+/
+\end_inset 
 
-\layout LyX-Code
+-stack-auto
+\emph default 
+ option is used
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-DATABANK   NAME=gpr0       START=0x80           END=0xFF
-\layout LyX-Code
+\layout Standard
 
-DATABANK   NAME=gpr1       START=0x100          END=0x1FF
-\layout LyX-Code
+SDCC_MODEL_SMALL
+\begin_inset LatexCommand \index{SDCC\_MODEL\_SMALL}
 
-DATABANK   NAME=gpr2       START=0x200          END=0x2FF
-\layout LyX-Code
+\end_inset 
 
-DATABANK   NAME=gpr3       START=0x300          END=0x3FF
-\layout LyX-Code
 
-DATABANK   NAME=gpr4       START=0x400          END=0x4FF
-\layout LyX-Code
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-DATABANK   NAME=gpr5       START=0x500          END=0x5FF
-\layout LyX-Code
+\layout Standard
 
-ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED
-\layout LyX-Code
+when 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
-\layout LyX-Code
+\layout Standard
 
-SECTION    NAME=CONFIG     ROM=config
-\layout LyX-Code
+\backslash 
+/
+\end_inset 
 
-\layout LyX-Code
+-model-small
+\emph default 
+ is used
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-SECTION    NAME=bank0      RAM=gpr0       # these SECTION directives
-\layout LyX-Code
+\layout Standard
 
-SECTION    NAME=bank1      RAM=gpr1       # should be added to link
-\layout LyX-Code
+SDCC_MODEL_MEDIUM
+\begin_inset LatexCommand \index{SDCC\_MODEL\_MEDIUM}
 
-SECTION    NAME=bank2      RAM=gpr2       # section name 'bank?' with
-\layout LyX-Code
+\end_inset 
 
-SECTION    NAME=bank3      RAM=gpr3       # a specific DATABANK name
-\layout LyX-Code
 
-SECTION    NAME=bank4      RAM=gpr4
-\layout LyX-Code
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-SECTION    NAME=bank5      RAM=gpr5
 \layout Standard
 
-The linker will recognise the section name set in the pragma statement and
- will position the variable at the memory bank set with the RAM field at
- the SECTION line in the linker script file.
-\layout Subsection
+when 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
-Header Files
-\begin_inset LatexCommand \label{sub:PIC16_Header-Files}
+\layout Standard
 
+\backslash 
+/
 \end_inset 
 
+-model-medium
+\emph default 
+ is used
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-There is one main header file
-\begin_inset LatexCommand \index{PIC16!Header files}
+SDCC_MODEL_LARGE
+\begin_inset LatexCommand \index{SDCC\_MODEL\_LARGE}
 
 \end_inset 
 
- that can be included to the source files using the pic16
-\begin_inset LatexCommand \index{PIC16}
 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- port.
- That file is the 
-\series bold 
-pic18fregs.h
-\series default 
-.
- This header file contains the definitions for the processor special registers,
- so it is necessary if the source accesses them.
- It can be included by adding the following line in the beginning of the
- file:
-\layout LyX-Code
-
-#include <pic18fregs.h>
 \layout Standard
 
-The specific microcontroller is selected within the pic18fregs.h automatically,
- so the same source can be used with a variety of devices.
-\layout Subsection
+when 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
-Libraries
 \layout Standard
 
-The libraries
-\begin_inset LatexCommand \index{PIC16!Libraries}
-
+\backslash 
+/
 \end_inset 
 
- that PIC16
-\begin_inset LatexCommand \index{PIC16}
-
+-model-large
+\emph default 
+ is used
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- port depends on are the microcontroller device libraries which contain
- the symbol definitions for the microcontroller special function registers.
- These libraries have the format pic18fxxxx.lib, where 
-\emph on 
-xxxx
-\emph default 
- is the microcontroller identification number.
- The specific library is selected automatically by the compiler at link
- stage according to the selected device.
 \layout Standard
 
-Libraries are created with gplib which is part of the gputils package 
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
+SDCC_USE_XSTACK
+\begin_inset LatexCommand \index{SDCC\_USE\_XSTACK}
 
 \end_inset 
 
-.
-\layout Subsubsection*
 
-Building the libraries
-\layout Standard
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-Before using SDCC/pic16 there are some libraries that need to be compiled.
- This process is not done automatically by SDCC since not all users use
- SDCC for pic16 projects.
- So each user should compile the libraries separately.
 \layout Standard
 
-The steps to compile the pic16 libraries under Linux are:
-\layout LyX-Code
-
-cd device/lib/pic16
-\layout LyX-Code
-
-./configure
-\layout LyX-Code
+when 
+\emph on 
+-
+\begin_inset ERT
+status Collapsed
 
-make
-\layout LyX-Code
+\layout Standard
 
-cd ..
-\layout LyX-Code
+\backslash 
+/
+\end_inset 
 
-make model-pic16
-\layout LyX-Code
+-xstack
+\emph default 
+ option is used
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-su -c 'make install'     # install the libraries, you need the root password
 \layout Standard
 
-If you need to install the headers too, do:
-\layout LyX-Code
+SDCC_STACK_TENBIT
+\begin_inset LatexCommand \index{SDCC\_STACK\_TENBIT}
 
-cd device/include
-\layout LyX-Code
-
-su -c 'make install'     # install the headers, you need the root password
-\layout Standard
-
-There exist a special target to build the I/O libraries.
- This target is not automatically build because it will build the I/O library
- for 
-\emph on 
-every
-\emph default 
- supported device.
- This way building will take quite a lot of time.
- Users are advised to edit the 
-\series bold 
-device/lib/pic16/pics.build
-\series default 
- file and then execute:
-\layout LyX-Code
-
-make lib-io
-\layout Subsection
-
-Memory Models
-\layout Standard
-
-The following memory models are supported by the PIC16 port:
-\layout Itemize
-
-small model
-\layout Itemize
-
-large model
-\layout Standard
-
-Memory model affects the default size of pointers within the source.
- The sizes are shown in the next table:
-\layout Standard
-\align center 
-
-\begin_inset  Tabular
-<lyxtabular version="3" rows="3" columns="3">
-<features>
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<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
-
-Pointer sizes according to memory model
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
-
-small model
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -19741,7 +19593,11 @@ small model
 
 \layout Standard
 
-large model
+when 
+\emph on 
+-mds390
+\emph default 
+ is used
 \end_inset 
 </cell>
 </row>
@@ -19751,15 +19607,12 @@ large model
 
 \layout Standard
 
-code pointers
+SDCC_MODEL_FLAT24
+\begin_inset LatexCommand \index{SDCC\_MODEL\_FLAT24}
+
 \end_inset 
-</cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-16-bits
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -19767,504 +19620,712 @@ code pointers
 
 \layout Standard
 
-24-bits
+when 
+\emph on 
+-mds390
+\emph default 
+ is used
 \end_inset 
 </cell>
 </row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
+</lyxtabular>
 
-data pointers
 \end_inset 
-</cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-16-bits
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\layout Chapter
 
-\layout Standard
+Notes on supported Processors
+\layout Section
+
+MCS51 variants
+\begin_inset LatexCommand \label{sub:MCS51-variants}
 
-16-bits
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
+
+
+\begin_inset LatexCommand \index{MCS51 variants}
 
 \end_inset 
 
 
 \layout Standard
 
-It is advisable that all sources within a project are compiled with the
- same memory model.
- If one wants to override the default memory model, this can be done by
- declaring a pointer as 
-\series bold 
-far
-\series default 
- or 
-\series bold 
-near
-\series default 
-.
- Far selects large memory model's pointers, while near selects small memory
- model's pointers.
+MCS51 processors are available from many vendors and come in many different
+ flavours.
+ While they might differ considerably in respect to Special Function Registers
+ the core MCS51 is usually not modified or is kept compatible.
+\layout Subsection
+
+pdata access by SFR 
 \layout Standard
 
-The standard device libraries (see 
-\begin_inset LatexCommand \ref{sub:PIC16_Header-Files}
+With the upcome of devices with internal xdata and flash memory devices
+ using port P2
+\begin_inset LatexCommand \index{P2 (mcs51 sfr)}
 
 \end_inset 
 
-) contain no reference to pointers, so they can be used with both memory
- models.
-\layout Subsection
+ as dedicated I/O port is becoming more popular.
+ Switching the high byte for pdata
+\begin_inset LatexCommand \index{pdata (mcs51, ds390 storage class)}
 
-Stack
-\layout Standard
+\end_inset 
 
-The stack
-\begin_inset LatexCommand \index{PIC16!stack}
+ access which was formerly done by port P2 is then achieved by a Special
+ Function Register
+\begin_inset LatexCommand \index{sfr}
 
 \end_inset 
 
- implementation for the PIC16 port uses two indirect registers, FSR1 and
- FSR2.
-\layout List
-\labelwidthstring 00.00.0000
-
-FSR1 is assigned as stack pointer
-\layout List
-\labelwidthstring 00.00.0000
+.
+ In well-established MCS51 tradition the address of this 
+\emph on 
+sfr
+\emph default 
+ is where the chip designers decided to put it.
+ Needless to say that they didn't agree on a common name either.
+ So that the startup code can correctly initialize xdata variables, you
+ should define an sfr with the name _XPAGE
+\family typewriter 
 
-FSR2 is assigned as frame pointer
-\layout Standard
+\begin_inset LatexCommand \index{\_XPAGE (mcs51)}
 
-The following stack models are supported by the PIC16 port
-\layout Itemize
+\end_inset 
 
 
-\noun on 
-small
-\noun default 
- model
-\layout Itemize
+\family default 
+ at the appropriate location if the default, port P2, is not used for this.
+ Some examples are:
+\layout Verse
 
 
-\noun on 
-large
-\noun default 
- model
-\layout Standard
+\family typewriter 
+__sfr __at (0x85) _XPAGE; /* Ramtron VRS51 family a.k.a.
+ MPAGE */
+\layout Verse
 
 
-\noun on 
-Small
-\noun default 
- model means that only the FSRxL byte is used to access stack and frame,
- while 
-\emph on 
-\noun on 
-large
-\emph default 
-\noun default 
- uses both FSRxL and FSRxH registers.
- The following table shows the stack/frame pointers sizes according to stack
- model and the maximum space they can address:
-\layout Standard
-\align center 
+\family typewriter 
+__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family, Texas Instruments (Chipcon)
+ a.k.a.
+ MPAGE */
+\layout Verse
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="3" columns="3">
-<features>
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<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
+\family typewriter 
+__sfr __at (0x91) _XPAGE; /* Infineon (Siemens) C500 family a.k.a.
+ XPAGE */
+\layout Verse
 
-Stack & Frame pointer sizes according to stack model
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\family typewriter 
+__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a.
+ EMI0CN */
+\layout Verse
 
-small
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+\family typewriter 
+__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a.
+ EMI0CN */
 \layout Standard
 
-large
+For more exotic implementations further customizations may be needed.
+ See section 
+\begin_inset LatexCommand \ref{sub:Startup-Code}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ for other possibilities.
+\layout Subsection
+
+Other Features available by SFR
 \layout Standard
+\added_space_bottom bigskip 
+Some MCS51 variants offer features like Double DPTR
+\begin_inset LatexCommand \index{DPTR}
 
-Stack pointer FSR1
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+, multiple DPTR, decrementing DPTR, 16x16 Multiply.
+ These are currently not used for the MCS51 port.
+ If you absolutely need them you can fall back to inline assembly or submit
+ a patch to SDCC.
+\layout Section
+
+DS400 port
 \layout Standard
+\added_space_bottom bigskip 
+The DS80C400
+\begin_inset LatexCommand \index{DS80C400}
 
-8-bits
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-16-bits
+\begin_inset LatexCommand \index{DS400}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ microcontroller has a rich set of peripherals.
+ In its built-in ROM library it includes functions to access some of the
+ features, among them is a TCP stack with IP4 and IP6 support.
+ Library headers (currently in beta status) and other files are provided
+ at 
+\size footnotesize 
+
+\begin_inset LatexCommand \url{ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html}
 
-Frame pointer FSR2
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+.
+\layout Section
+
+The Z80 and gbz80 port
 \layout Standard
 
-8-bits
+SDCC can target both the Zilog Z80
+\begin_inset LatexCommand \index{Z80}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ and the Nintendo Gameboy's Z80-like gbz80
+\begin_inset LatexCommand \index{gbz80 (GameBoy Z80)}
 
-16-bits
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
+
+.
+ The Z80 port is passed through the same 
+\emph on 
+regressions tests
+\begin_inset LatexCommand \index{Regression test}
 
 \end_inset 
 
 
-\layout Standard
+\emph default 
+ (see section 
+\begin_inset LatexCommand \ref{sec:Quality-control}
 
+\end_inset 
 
-\noun on 
-Large 
-\noun default 
-stack model is currently not working properly throughout the code generator.
- So its use is not advised.
- Also there are some other points that need special care:
-\newline 
+) as the MCS51 and DS390 ports, so floating point support, support for long
+ variables and bitfield support is fine.
+ See mailing lists and forums about interrupt routines.
+\layout Standard
+\added_space_bottom bigskip 
+As always, the code is the authoritative reference - see z80/ralloc.c and
+ z80/gen.c.
+ The stack
+\begin_inset LatexCommand \index{Z80!stack}
 
-\layout Enumerate
+\end_inset 
 
-Do not create stack sections with size more than one physical bank (that
- is 256 bytes)
-\layout Enumerate
+ frame is similar to that generated by the IAR Z80 compiler.
+ IX is used as the base pointer, HL and IY are used as a temporary registers,
+ and BC and DE are available for holding variables.
+ Return values
+\begin_inset LatexCommand \index{Z80!return value}
 
-Stack sections should no cross physical bank limits (i.e.
- #pragma stack 0x50 0x100)
-\layout Standard
+\end_inset 
 
-These limitations are caused by the fact that only FSRxL is modified when
- using SMALL stack model, so no more than 256 bytes of stack can be used.
- This problem will disappear after LARGE model is fully implemented.
-\layout Subsection
+ for the Z80 port are stored in L (one byte), HL (two bytes), or DEHL (four
+ bytes).
+ The gbz80 port use the same set of registers for the return values, but
+ in a different order of significance: E (one byte), DE (two bytes), or
+ HLDE (four bytes).
+\layout Section
 
-Functions
+The HC08 port
 \layout Standard
 
-In addition to the standard SDCC function keywords, PIC16
-\begin_inset LatexCommand \index{PIC16}
+The port to the Freescale/Motorola HC08
+\begin_inset LatexCommand \index{HC08}
 
 \end_inset 
 
- port makes available two more:
-\layout List
-\labelwidthstring 00.00.0000
-
-wparam
-\begin_inset LatexCommand \index{PIC16!wparam}
+ family has been added in October 2003, and is still undergoing some basic
+ development.
+ The code generator is complete, but the register allocation is still quite
+ unoptimized.
+ Some of the SDCC's standard C library functions have embedded non-HC08
+ inline assembly and so are not yet usable.
+\layout Standard
+\added_space_bottom bigskip \pagebreak_bottom 
+The HC08 port passes the regression test suite (see section 
+\begin_inset LatexCommand \ref{sec:Quality-control}
 
 \end_inset 
 
- Use the WREG to pass one byte of the first function argument.
- This improves speed but you may not use this for functions with arguments
- that are called via function pointers, otherwise the first byte of the
- first parameter will get lost.
- Usage:
-\layout LyX-Code
+).
+\layout Section
 
-void func_wparam(int a) wparam
-\layout LyX-Code
+The PIC14 port
+\layout Standard
 
-{
-\layout LyX-Code
+The 14bit PIC
+\begin_inset LatexCommand \index{PIC14}
 
-    /* WREG hold the lower part of a */
-\layout LyX-Code
+\end_inset 
 
-    /* the high part of a is stored in FSR2+2 (or +3 for large stack model)
- */
-\layout LyX-Code
+ port still requires a major effort from the development community.
+ However it can work for simple code.
+ It passes its (smaller set of) regression tests
+\begin_inset LatexCommand \index{Regression test (PIC14)}
 
-...
-\layout LyX-Code
+\end_inset 
 
-}
-\layout Standard
+ in the directory 
+\shape italic 
+sdcc/src/regression
+\shape default 
+.
+\layout Subsection
 
-This keyword replaces the deprecated wparam pragma.
-\layout List
-\labelwidthstring 00.00.0000
+C code and 14bit PIC code page
+\begin_inset LatexCommand \index{code page (pic14)}
 
-shadowregs
-\begin_inset LatexCommand \index{PIC16!shadowregs}
+\end_inset 
+
+ and RAM banks
+\begin_inset LatexCommand \index{RAM bank (pic14)}
 
 \end_inset 
 
- When entering/exiting an ISR, it is possible to take advantage of the PIC18F
- hardware shadow registers which hold the values of WREG, STATUS and BSR
- registers.
- This can be done by adding the keyword 
-\emph on 
-shadowregs
-\emph default 
- before the 
-\emph on 
-interrupt
-\emph default 
- keyword in the function's header.
-\layout LyX-Code
 
-void isr_shadow(void) shadowregs interrupt 1
-\layout LyX-Code
+\layout Standard
 
-{
-\layout LyX-Code
+The linker organizes allocation for the code page and RAM banks.
+ It does not have intimate knowledge of the code flow.
+ It will put all the code section of a single asm file into a single code
+ page.
+ In order to make use of multiple code pages, separate asm files must be
+ used.
+ The compiler treats all functions of a single C file as being in the same
+ code page unless it is non static.
+\newline 
 
-...
-\layout LyX-Code
+\newline 
+To get the best follow these guide lines:
+\layout Enumerate
 
-}
-\layout Standard
+Make local functions static, as non static functions require code page selection
+ overhead.
+\layout Enumerate
 
+For devices that have multiple code pages it is more efficient to use the
+ same number of files as pages, i.e.
+ for the 16F877 use 4 separate files and i.e.
+ for the 16F874 use 2 separate files.
+ This way the linker can put the code for each file into different code
+ pages and there's less page selection overhead.
+\layout Enumerate
 
-\emph on 
-shadowregs
-\emph default 
- instructs the code generator not to store/restore WREG, STATUS, BSR when
- entering/exiting the ISR.
+And as for any 8 bit micro (especially for PIC 14 as they have a very simple
+ instruction set), use 'unsigned char' whereever possible instead of 'int'.
 \layout Subsection
 
-Function return values
+Creating a device include file 
 \layout Standard
 
-Return values from functions are placed to the appropriate registers following
- a modified Microchip policy optimized for SDCC.
- The following table shows these registers:
-\layout Standard
-\align center 
+For generating a device include file
+\begin_inset LatexCommand \index{PIC14!Header files}
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="6" 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
+\end_inset 
+
+ use the support perl script inc2h.pl kept in directory support/script.
+\layout Subsection
 
+Interrupt code
 \layout Standard
 
-size
+For the interrupt function, use the keyword '__interrupt'
+\begin_inset LatexCommand \index{PIC14!interrupt}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ with level number of 0 (PIC14 only has 1 interrupt so this number is only
+ there to avoid a syntax error - it ought to be fixed).
+ E.g.:
+\layout Verse
 
-destination register
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+\family typewriter 
+void Intr(void) __interrupt 0
+\newline 
+{
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+T0IF = 0; /* Clear timer interrupt */
+\newline 
+}
+\layout Subsection
+
+Linking and assembling
 \layout Standard
 
-8 bits
+For assembling you can use either GPUTILS'
+\begin_inset LatexCommand \index{gputils (pic tools)}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ gpasm.exe or MPLAB's mpasmwin.exe.
+ GPUTILS is available from 
+\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
 
-WREG
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+ For linking you can use either GPUTIL's gplink or MPLAB's mplink.exe.
+ If you use MPLAB and an interrupt function then the linker script file
+ vectors section will need to be enlarged to link with mplink.
+\newline 
 
-16 bits
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\newline 
+Here is a 
+\family typewriter 
+Makefile
+\family default 
+ using GPUTILS:
+\layout Verse
+
+
+\family typewriter 
+.c.o:
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+sdcc -S -V -mpic14 -p16F877 $< 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+gpasm -c $*.asm
+\newline 
 
+\newline 
+$(PRJ).hex: $(OBJS) 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+gplink -m -s $(PRJ).lkr -o $(PRJ).hex $(OBJS) libsdcc.lib
 \layout Standard
 
-PRODL:WREG
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+Here is a 
+\family typewriter 
+Makefile
+\family default 
+ using MPLAB:
+\layout Verse
+
+
+\family typewriter 
+.c.o: 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+sdcc -S -V -mpic14 -p16F877 $< 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mpasmwin /q /o $*.asm
+\newline 
 
+\newline 
+$(PRJ).hex: $(OBJS) 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib
 \layout Standard
 
-24 bits
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+Please note that indentations within a
+\family typewriter 
+ Makefile
+\family default 
+ have to be done with a tabulator character.
+\layout Subsection
 
+Command-line options
 \layout Standard
 
-PRODH:PRODL:WREG
-\end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+Besides the switches common to all SDCC backends, the PIC14 port accepts
+ the following options (for an updated list see sdcc -
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-32 bits
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+-help):
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-FSR0L:PRODH:PRODL:WREG
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-debug-extra
+\begin_inset LatexCommand \index{PIC14!Options!-\/-debug-extra}
 
->32 bits
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+ emit debug info in assembly output
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-on stack, FSR0 points to the beginning
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
+
+-no-pcode-opt
+\begin_inset LatexCommand \index{PIC14!Options!-\/-no-pcode-opt}
 
 \end_inset 
 
+ disable (slightly faulty) optimization on pCode
+\layout List
+\labelwidthstring 00.00.0000
 
-\layout Subsection
+-
+\begin_inset ERT
+status Collapsed
 
-Interrupts
 \layout Standard
 
-An interrupt
-\begin_inset LatexCommand \index{PIC16!interrupt}
-
+\backslash 
+/
 \end_inset 
 
- service routine (ISR) is declared using the 
-\emph on 
-interrupt
-\emph default 
- keyword.
-\layout LyX-Code
+-stack-loc
+\begin_inset LatexCommand \index{PIC14!Options!-\/-stack-loc}
 
-void isr(void) interrupt 
-\emph on 
-n
-\layout LyX-Code
+\end_inset 
 
-{
-\layout LyX-Code
+ sets the lowest address of the argument passing stack (defaults to a suitably
+ large shared databank to reduce BANKSEL overhead)
+\layout List
+\labelwidthstring 00.00.0000
 
-...
-\layout LyX-Code
+-
+\begin_inset ERT
+status Collapsed
 
-}
 \layout Standard
 
+\backslash 
+/
+\end_inset 
 
-\emph on 
-n
-\emph default 
- is the interrupt number, which for PIC18F devices can be:
-\layout Standard
-\align center 
+-stack-size
+\begin_inset LatexCommand \index{PIC14!Options!-\/-stack-size}
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="4" columns="3">
-<features>
+\end_inset 
+
+ sets the size if the argument passing stack (default: 16, minimum: 4)
+\layout Subsection
+
+The library
+\layout Subsubsection
+
+error: missing definition for symbol 
+\begin_inset Quotes sld
+\end_inset 
+
+__gptrget1
+\begin_inset Quotes srd
+\end_inset 
+
+
+\layout Standard
+
+The PIC14 port uses library routines to provide more complex operations
+ like multiplication, division/modulus and (generic) pointer dereferencing.
+ In order to add these routines to your project, you must link with PIC14's
+\family typewriter 
+libsdcc.lib
+\family default 
+.
+ For single source file projects this is done automatically, more complex
+ projects must add 
+\family typewriter 
+libsdcc.lib
+\family default 
+ to the linker's arguments.
+ Make sure you also add an include path for the library (using the -I switch
+ to the linker)!
+\layout Subsubsection
+
+Processor mismatch in file 
+\begin_inset Quotes sld
+\end_inset 
+
+XXX
+\begin_inset Quotes srd
+\end_inset 
+
+.
+\layout Standard
+
+This warning can usually be ignored due to the very good compatibility amongst
+ 14 bit PIC
+\begin_inset LatexCommand \index{PIC14}
+
+\end_inset 
+
+ devices.
+\layout Standard
+
+You might also consider recompiling the library for your specific device
+ by changing the ARCH=p16f877 (default target) entry in 
+\family typewriter 
+device/lib/pic/Makefile.in
+\family default 
+ and 
+\family typewriter 
+device/lib/pic/Makefile
+\family default 
+ to reflect your device.
+ This might even improve performance for smaller devices as unneccesary
+ BANKSELs migth be removed.
+\layout Subsection
+
+Known bugs
+\layout Subsubsection
+
+initialized data
+\layout Standard
+\pagebreak_bottom 
+Currently, data can only be initialized if it resides in the source file
+ together with 
+\emph on 
+main()
+\emph default 
+.
+ Data in other source files will silently 
+\series bold 
+not
+\series default 
+ be initialized.
+\family typewriter 
+\size footnotesize 
+
+\begin_inset Marginal
+collapsed true
+
+\layout Standard
+
+
+\series bold 
+\SpecialChar ~
+!
+\end_inset 
+
+
+\layout Section
+
+The PIC16
+\begin_inset LatexCommand \index{PIC16}
+
+\end_inset 
+
+ port
+\layout Standard
+
+The PIC16
+\begin_inset LatexCommand \index{PIC16}
+
+\end_inset 
+
+ port is the portion of SDCC that is responsible to produce code for the
+ Microchip
+\begin_inset LatexCommand \index{Microchip}
+
+\end_inset 
+
+(TM) microcontrollers with 16 bit core.
+ Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx.
+ Currently supported devices are:
+\layout Standard
+\align center 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="4" columns="6">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
 <column alignment="center" valignment="top" leftline="true" width="0">
 <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">
+<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+18F242
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\emph on 
-n
+\layout Standard
+
+18F248
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 
 \layout Standard
 
-Interrupt Vector
+18F252
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -20280,7 +20341,23 @@ Interrupt Vector
 
 \layout Standard
 
-Interrupt Vector Address
+18F258
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18F442
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18F448
 \end_inset 
 </cell>
 </row>
@@ -20290,7 +20367,7 @@ Interrupt Vector Address
 
 \layout Standard
 
-0
+18F452
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -20298,7 +20375,15 @@ Interrupt Vector Address
 
 \layout Standard
 
-RESET vector
+18F458
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18F1220
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -20306,7 +20391,23 @@ RESET vector
 
 \layout Standard
 
-0x000000
+18F2220
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18F2550
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18F4331
 \end_inset 
 </cell>
 </row>
@@ -20316,16 +20417,15 @@ RESET vector
 
 \layout Standard
 
+18F4455
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-1
+\layout Standard
+
+18F6520
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -20333,16 +20433,15 @@ RESET vector
 
 \layout Standard
 
+18F6620
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-HIGH priority interrupts
+\layout Standard
+
+18F6680
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -20350,7 +20449,15 @@ HIGH priority interrupts
 
 \layout Standard
 
-0x000008
+18F6720
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+18F8520
 \end_inset 
 </cell>
 </row>
@@ -20360,7 +20467,7 @@ HIGH priority interrupts
 
 \layout Standard
 
-2
+18F8620
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -20368,558 +20475,542 @@ HIGH priority interrupts
 
 \layout Standard
 
-LOW priority interrupts
+18F8680
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-0x000018
+18F8720
 \end_inset 
 </cell>
-</row>
-</lyxtabular>
-
-\end_inset 
-
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-When generating assembly code for ISR the code generator places a 
-\noun on 
-goto 
-\noun default 
-instruction at the 
-\emph on 
-Interrupt Vector Address
-\emph default 
- which points at the genetated ISR.
- This single GOTO instruction is part of an automatically generated 
-\emph on 
-interrupt entry point
-\emph default 
- function.
- The actuall ISR code is placed as normally would in the code space.
- Upon interrupt request, the GOTO instruction is executed which jumps to
- the ISR code.
- When declaring interrupt functions as _naked this GOTO instruction is 
-\series bold 
-not
-\series default 
- generated.
- The whole interrupt functions is therefore placed at the Interrupt Vector
- Address of the specific interrupt.
- This is not a problem for the LOW priority interrupts, but it is a problem
- for the RESET and the HIGH priority interrupts because code may be written
- at the next interrupt´s vector address and cause undeterminate program
- behaviour if that interrupt is raised.
-\begin_inset Foot
-collapsed false
-
-\layout Standard
-
-This is not a problem when
-\layout Enumerate
-
-this is a HIGH interrupt ISR and LOW interrupts are 
-\emph on 
-disabled
-\emph default 
- or not used.
-\layout Enumerate
-
-when the ISR is small enough not to reach the next interrupt´s vector address.
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-
-\layout Standard
-
-
-\emph on 
-n
-\emph default 
- is possible to be omitted.
- This way a function is generated similar to an ISR, but it is not assigned
- to any interrupt.
 \layout Standard
 
-When entering an interrupt, currently the PIC16
-\begin_inset LatexCommand \index{PIC16}
-
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- port automatically saves the following registers:
-\layout Itemize
-
-WREG
-\layout Itemize
-
-STATUS
-\layout Itemize
-
-BSR
-\layout Itemize
-
-PROD (PRODL and PRODH)
-\layout Itemize
-
-FSR0 (FSR0L and FSR0H)
 \layout Standard
 
-These registers are restored upon return from the interrupt routine.
-\begin_inset Foot
-collapsed false
-
-\layout Standard
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
-NOTE that when the _naked attribute is specified for an interrupt routine,
- then NO registers are stored or restored.
 \end_inset 
 
 
 \layout Subsection
 
-Generic Pointers
+Global Options
 \layout Standard
 
-Generic pointers are implemented in PIC16 port as 3-byte (24-bit) types.
- There are 3 types of generic pointers currently implemented data, code
- and eeprom pointers.
- They are differentiated by the value of the 7th and 6th bits of the upper
- byte:
-\layout Standard
-\align center 
+PIC16 port supports the standard command line arguments as supposed, with
+ the exception of certain cases that will be mentioned in the following
+ list:
+\layout List
+\labelwidthstring 00.00.0000
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="5" columns="5">
-<features>
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="left" valignment="top" rightline="true" width="0">
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-pointer type
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-callee-saves
+\begin_inset LatexCommand \index{PIC16!Options!-\/-callee-saves}
 
-7th bit
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+ See -
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-6th bit
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-all-callee-saves
+\layout List
+\labelwidthstring 00.00.0000
 
-rest of the pointer
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-description
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-all-callee-saves
+\begin_inset LatexCommand \index{PIC16!Options!-\/-all-callee-saves}
 
-data 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+
+ All function arguments are passed on stack by default.
+\emph on 
+There is no need to specify this in the command line.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-1
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-fommit-frame-pointer
+\begin_inset LatexCommand \index{PIC16!Options!-\/-fommit-frame-pointer}
 
-0
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ Frame pointer will be omitted when the function uses no local variables.
+\layout Subsection
 
+Port Specific Options
+\begin_inset LatexCommand \index{Options PIC16}
 
-\family typewriter 
-\shape slanted 
-\emph on 
-uuuuuu uuuuxxxx xxxxxxxx
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
 
 \layout Standard
 
-a 12-bit data pointer in data RAM memory
-\end_inset 
-</cell>
-</row>
-<row bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+The port specific options appear after the global options in the sdcc --help
+ output.
+\layout Subsubsection
 
+General Options
 \layout Standard
 
-code
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+General options enable certain port features and optimizations.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-0
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-pstack-model=[model] Used in conjuction with the command above.
+ Defines the stack model to be used, valid stack models are : 
+\begin_deeper 
+\layout List
+\labelwidthstring 00.00.0000
 
-0
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+\emph on 
+small
+\emph default 
+ Selects small stack model.
+ 8 bit stack and frame pointers.
+ Supports 256 bytes stack size.
+\layout List
+\labelwidthstring 00.00.0000
 
 
-\family typewriter 
-\shape slanted 
 \emph on 
-uxxxxx xxxxxxxx xxxxxxxx
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+large
+\emph default 
+ Selects large stack model.
+ 16 bit stack and frame pointers.
+ Supports 65536 bytes stack size.
+\end_deeper 
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-a 21-bit code pointer in FLASH memory
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-<row bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-preplace-udata-with=[kword] Replaces the default udata keyword for allocating
+ unitialized data variables with [kword].
+ Valid keywords are: "udata_acs", "udata_shr", "udata_ovr".
+\layout List
+\labelwidthstring 00.00.0000
 
-eeprom
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-0
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-ivt-loc <nnnn> positions the Interrupt Vector Table at location <nnnn>.
+ Useful for bootloaders.
+\layout List
+\labelwidthstring 00.00.0000
 
-1
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-
-\family typewriter 
-\shape slanted 
-\emph on 
-uuuuuu uuuuuuxx xxxxxxxx
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-asm= sets the full path and name of an external assembler to call.
+\layout List
+\labelwidthstring 00.00.0000
 
-a 10-bit eeprom pointer in EEPROM memory
-\end_inset 
-</cell>
-</row>
-<row bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-(unimplemented)
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+
+-link= sets the full path and name of an external linker to call.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-1
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-mplab-comp MPLAB
+\begin_inset LatexCommand \index{PIC16!MPLAB}
 
-1
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ compatibility option.
+ Currently only suppresses special gpasm directives.
+\layout Subsubsection
 
+Optimization Options
+\layout List
+\labelwidthstring 00.00.0000
 
-\family typewriter 
-\shape slanted 
-\emph on 
-xxxxxx xxxxxxxx xxxxxxxx
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-unimplemented pointer type
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
 
-\end_inset 
+-optimize-goto Try to use (conditional) BRA instead of GOTO
+\layout List
+\labelwidthstring 00.00.0000
 
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-Generic pointer are read and written with a set of library functions which
- read/write 1, 2, 3, 4 bytes.
-\layout Subsection
-
-PIC16 C Libraries
-\layout Subsubsection
+\backslash 
+/
+\end_inset 
 
-Standard I/O Streams
-\layout Standard
+-optimize-cmp Try to optimize some compares.
+\layout List
+\labelwidthstring 00.00.0000
 
-In the 
-\emph on 
-stdio.h
-\emph default 
- the type FILE is defined as:
-\layout LyX-Code
+-
+\begin_inset ERT
+status Collapsed
 
-typedef char * FILE;
 \layout Standard
 
-This type is the stream type implemented I/O in the PIC18F devices.
- Also the standard input and output streams are declared in stdio.h:
-\layout LyX-Code
+\backslash 
+/
+\end_inset 
 
-extern FILE * stdin;
-\layout LyX-Code
+-optimize-df Analyze the dataflow of the generated code and improve it.
+\layout List
+\labelwidthstring 00.00.0000
 
-extern FILE * stdout;
-\layout Standard
+-
+\begin_inset ERT
+status Collapsed
 
-The FILE type is actually a generic pointer which defines one more type
- of generic pointers, the 
-\emph on 
-stream 
-\emph default 
-pointer.
- This new type has the format:
 \layout Standard
-\align center 
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="2" columns="7">
-<features>
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<column alignment="center" valignment="top" width="0">
-<column alignment="left" valignment="top" rightline="true" width="0">
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\backslash 
+/
+\end_inset 
 
-\layout Standard
+-obanksel=nn Set optimization level for inserting BANKSELs.
+\newline 
 
-pointer type
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\begin_deeper 
+\layout List
+\labelwidthstring 00.00.0000
 
-\layout Standard
+0 no optimization
+\layout List
+\labelwidthstring 00.00.0000
 
-<7:6>
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+1 checks previous used register and if it is the same then does not emit
+ BANKSEL, accounts only for labels.
+\layout List
+\labelwidthstring 00.00.0000
 
-\layout Standard
+2 tries to check the location of (even different) symbols and removes BANKSELs
+ if they are in the same bank.
+\newline 
 
-<5>
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+\emph on 
+Important: There might be problems if the linker script has data sections
+ across bank borders!
+\end_deeper 
+\layout Subsubsection
 
-\layout Standard
+Linking Options
+\layout List
+\labelwidthstring 00.00.0000
 
-<4>
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-<3:0>
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+-nodefaultlibs do not link default libraries when linking
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-rest of the pointer
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+-no-crt Don't link the default run-time modules
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-descrption
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+-use-crt= Use a custom run-time module instead of the defaults.
+\layout Subsubsection
+
+Debugging Options
 \layout Standard
 
-stream
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+Debugging options enable extra debugging information in the output files.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-00
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+-debug-xtra Similar to -
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-1
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+-debug
+\begin_inset LatexCommand \index{-\/-debug}
 
-0
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+, but dumps more information.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-nnnn
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+-debug-ralloc Force register allocator to dump <source>.d file with debugging
+ information.
+ <source> is the name of the file compiled.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
+\backslash 
+/
+\end_inset 
 
-\family typewriter 
-\shape slanted 
-\emph on 
-uuuuuuuu uuuuuuuu
+-pcode-verbose Enable pcode debugging information in translation.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+-denable-peeps Force the usage of peepholes.
+ Use with care.
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-upper byte high nubble is 0x2n, the rest are zeroes
+\backslash 
+/
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
 
+-gstack Trace push/pops for stack pointer overflow
+\layout List
+\labelwidthstring 00.00.0000
+
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
 \end_inset 
 
+-call-tree dump call tree in .calltree file
+\layout Subsection
 
+Enviromental Variables
 \layout Standard
 
-Currently implemented there are 3 types of streams defined:
+There is a number of enviromental variables that can be used when running
+ SDCC to enable certain optimizations or force a specific program behaviour.
+ these variables are primarily for debugging purposes so they can be enabled/dis
+abled at will.
+\layout Standard
+
+Currently there is only two such variables available:
+\layout List
+\labelwidthstring 00.00.0000
+
+OPTIMIZE_BITFIELD_POINTER_GET when this variable exists reading of structure
+ bitfields is optimized by directly loading FSR0 with the address of the
+ bitfield structure.
+ Normally SDCC will cast the bitfield structure to a bitfield pointer and
+ then load FSR0.
+ This step saves data ram and code space for functions that perform heavy
+ use of bitfields.
+ (ie.
+ 80 bytes of code space are saved when compiling malloc.c with this option).
+\layout List
+\labelwidthstring 00.00.0000
+
+NO_REG_OPT do not perform pCode registers optimization.
+ This should be used for debugging purposes.
+ In some where bugs in the pcode optimizer are found, users can benefit
+ from temporarily disabling the optimizer until the bug is fixed.
+\layout Subsection
+
+Preprocessor Macros
+\layout Standard
+
+PIC16
+\begin_inset LatexCommand \index{PIC16}
+
+\end_inset 
+
+ port defines the following preprocessor macros while translating a source.
 \layout Standard
 \align center 
 
 \begin_inset  Tabular
-<lyxtabular version="3" rows="4" columns="4">
+<lyxtabular version="3" rows="6" columns="2">
 <features>
 <column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<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">
@@ -20927,23 +21018,25 @@ Currently implemented there are 3 types of streams defined:
 
 \layout Standard
 
-stream type
+Macro
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-value
+Description
 \end_inset 
 </cell>
+</row>
+<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-module
+SDCC_pic16
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -20951,7 +21044,7 @@ module
 
 \layout Standard
 
-description
+Port identification
 \end_inset 
 </cell>
 </row>
@@ -20961,25 +21054,17 @@ description
 
 \layout Standard
 
-STREAM_USART
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+_
+\begin_inset ERT
+status Collapsed
 
 \layout Standard
 
-
-\family typewriter 
-0x200000UL
+\backslash 
+/
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-USART
+_pic16
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -20987,7 +21072,7 @@ USART
 
 \layout Standard
 
-Writes/Reads characters via the USART peripheral
+Port identification (same as above)
 \end_inset 
 </cell>
 </row>
@@ -20997,25 +21082,41 @@ Writes/Reads characters via the USART peripheral
 
 \layout Standard
 
-STREAM_MSSP
+pic18fxxxx
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-
-\family typewriter 
-0x210000UL
+MCU Identification.
+\emph on 
+xxxx
+\emph default 
+ is the microcontrol identification number, i.e.
+ 452, 6620, etc
 \end_inset 
 </cell>
+</row>
+<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-MSSP
+_
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+_18Fxxxx
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21023,7 +21124,7 @@ MSSP
 
 \layout Standard
 
-Writes/Reads characters via the MSSP peripheral
+MCU Identification (same as above)
 \end_inset 
 </cell>
 </row>
@@ -21033,25 +21134,7 @@ Writes/Reads characters via the MSSP peripheral
 
 \layout Standard
 
-STREAM_USER
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
-
-
-\family typewriter 
-0x2f0000UL
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
-
-(none)
+STACK_MODEL_nnn
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21059,7 +21142,7 @@ STREAM_USER
 
 \layout Standard
 
-Writes/Reads characters via used defined functions
+nnn = SMALL or LARGE respectively according to the stack model used
 \end_inset 
 </cell>
 </row>
@@ -21070,161 +21153,119 @@ Writes/Reads characters via used defined functions
 
 \layout Standard
 
-The stream identifiers are declared as macros in the stdio.h header.
+In addition the following macros are defined when calling assembler:
 \layout Standard
+\align center 
 
-In the libc library there exist the functions that are used to write to
- each of the above streams.
- These are
-\layout List
-\labelwidthstring 00.00.0000
-
-_
-\begin_inset ERT
-status Collapsed
+\begin_inset  Tabular
+<lyxtabular version="3" rows="4" 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
 
-\backslash 
-/
+Macro
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-_stream_usart_putchar writes a character at the USART stream
-\layout List
-\labelwidthstring 00.00.0000
+\layout Standard
 
-_
-\begin_inset ERT
-status Collapsed
+Description
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+__18Fxxxx
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-_stream_mssp_putchar writes a character at the MSSP stream
-\layout List
-\labelwidthstring 00.00.0000
-
-putchar dummy function.
- This writes a character to a user specified manner.
 \layout Standard
 
-In order to increase performance 
-\emph on 
-putchar 
-\emph default 
-is declared in stdio.h as having its parameter in WREG (it has the wparam
- keyword).
- In stdio.h exists the macro PUTCHAR(arg) that defines the putchar function
- in a user-friendly way.
+MCU Identification.
  
 \emph on 
-arg
+xxxx
 \emph default 
- is the name of the variable that holds the character to print.
- An example follows:
-\layout LyX-Code
-
-#include <pic18fregs.h>
-\newline 
-#include <stdio.h>
-\newline 
-
-\newline 
-PUTCHAR( c )
-\layout LyX-Code
-
-{
-\layout LyX-Code
-
-    PORTA = c;    /* dump character c to PORTA */
-\layout LyX-Code
-
-} 
-\newline 
-
-\newline 
-void main(void)
-\layout LyX-Code
-
-{
-\layout LyX-Code
-
-    stdout = STREAM_USER;    /* this is not necessary, since stdout points
-\layout LyX-Code
-
-                              * by default to STREAM_USER */
-\layout LyX-Code
-
-    printf (¨This is a printf test
-\backslash 
-n¨);
-\layout LyX-Code
+ is the microcontrol identification number, i.e.
+ 452, 6620, etc
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-}
-\layout LyX-Code
+\layout Standard
 
-\layout Subsubsection
+SDCC_MODEL_nnn
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-Printing functions
 \layout Standard
 
-PIC16 contains an implementation of the printf-family of functions.
- There exist the following functions:
-\layout LyX-Code
+nnn = SMALL or LARGE respectively according to the memory model used for
+ SDCC
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-extern unsigned int sprintf(char *buf, char *fmt, ...);
-\layout LyX-Code
+\layout Standard
 
-extern unsigned int vsprintf(char *buf, char *fmt, va_list ap);
-\layout LyX-Code
+STACK_MODEL_nnn
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\layout LyX-Code
+\layout Standard
 
-extern unsigned int printf(char *fmt, ...);
-\layout LyX-Code
+nnn = SMALL or LARGE respectively according to the stack model used
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
-extern unsigned int vprintf(char *fmt, va_lista ap);
-\layout LyX-Code
+\end_inset 
 
-\layout LyX-Code
 
-extern unsigned int fprintf(FILE *fp, char *fmt, ...);
-\layout LyX-Code
+\layout Subsection
 
-extern unsigned int vfprintf(FILE *fp, char *fmt, va_list ap);
+Directories
 \layout Standard
 
-For sprintf and vsprintf 
-\emph on 
-buf 
-\emph default 
-should normally be a data pointer where the resulting string will be placed.
- No range checking is done so the user should allocate the necessery buffer.
- For fprintf and vfprintf 
-\emph on 
-fp
-\emph default 
- should be a stream pointer (i.e.
- stdout, STREAM_MSSP, etc...).
-\layout Subsubsection
+PIC16
+\begin_inset LatexCommand \index{PIC16}
 
-Signals
-\layout Standard
+\end_inset 
 
-The PIC18F family of microcontrollers supports a number of interrupt sources.
- A list of these interrupts is shown in the following table:
+ port uses the following directories for searching header files and libraries.
 \layout Standard
 \align center 
 
 \begin_inset  Tabular
-<lyxtabular version="3" rows="11" columns="4">
+<lyxtabular version="3" rows="3" columns="4">
 <features>
-<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
 <column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
-<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" 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">
@@ -21232,7 +21273,7 @@ The PIC18F family of microcontrollers supports a number of interrupt sources.
 
 \layout Standard
 
-signal name
+Directory
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21240,7 +21281,7 @@ signal name
 
 \layout Standard
 
-description
+Description
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21248,7 +21289,7 @@ description
 
 \layout Standard
 
-signal name
+Target
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21256,7 +21297,7 @@ signal name
 
 \layout Standard
 
-descritpion
+Command prefix
 \end_inset 
 </cell>
 </row>
@@ -21266,15 +21307,15 @@ descritpion
 
 \layout Standard
 
-SIG_RB
+PREFIX/sdcc/include/pic16
 \end_inset 
 </cell>
-<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-PORTB change interrupt
+PIC16 specific headers
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21282,7 +21323,7 @@ PORTB change interrupt
 
 \layout Standard
 
-SIG_EE
+Compiler
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21290,17 +21331,17 @@ SIG_EE
 
 \layout Standard
 
-EEPROM/FLASH write complete interrupt
+-I
 \end_inset 
 </cell>
 </row>
-<row topline="true">
+<row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SIG_INT0
+PREFIX/sdcc/lib/pic16
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21308,7 +21349,7 @@ SIG_INT0
 
 \layout Standard
 
-INT0 external interrupt
+PIC16 specific libraries
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21316,7 +21357,7 @@ INT0 external interrupt
 
 \layout Standard
 
-SIG_BCOL
+Linker
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21324,101 +21365,159 @@ SIG_BCOL
 
 \layout Standard
 
-Bus collision interrupt
+-L
 \end_inset 
 </cell>
 </row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
+</lyxtabular>
 
-SIG_INT1
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
-INT1 external interrupt
+\layout Subsection
+
+Pragmas
+\begin_inset LatexCommand \label{sub:PIC16_Pragmas}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
 
 \layout Standard
 
-SIG_LVD
+PIC16
+\begin_inset LatexCommand \index{PIC16}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ port currently supports the following pragmas:
+\layout List
+\labelwidthstring 00.00.0000
+
+stack
+\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma stack}
 
-Low voltage detect interrupt
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ pragma stack
+\begin_inset LatexCommand \index{PIC16!stack}
 
-SIG_INT2
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+ forces the code generator to initialize the stack & frame pointers at a
+ specific address.
+ This is an adhoc solution for cases where no STACK directive is available
+ in the linker script or gplink is not instructed to create a stack section.
+\newline 
+The stack pragma should be used only once in a project.
+ Multiple pragmas may result in indeterminate behaviour of the program.
+\begin_inset Foot
+collapsed false
 
 \layout Standard
 
-INT2 external interrupt
+The old format (ie.
+ #pragma stack 0x5ff) is deprecated and will cause the stack pointer to
+ cross page boundaries (or even exceed the available data RAM) and crash
+ the program.
+ Make sure that stack does not cross page boundaries when using the SMALL
+ stack model.
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+
+\newline 
+The format is as follows:
+\layout LyX-Code
+
+#pragma stack bottom_address [stack_size]
 \layout Standard
 
-SIG_PSP
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+\emph on 
+bottom_address
+\emph default 
+ is the lower bound of the stack section.
+ The stack pointer initially will point at address (bottom_address+stack_size-1).
+\layout LyX-Code
+
+Example:
+\layout LyX-Code
+
+\layout LyX-Code
+
+/* initializes stack of 100 bytes at RAM address 0x200 */
+\layout LyX-Code
+
+#pragma stack 0x200 100
 \layout Standard
 
-Parallel slave port interrupt
+If the stack_size field is omitted then a stack is created with the default
+ size of 64.
+ This size might be enough for most programs, but its not enough for operations
+ with deep function nesting or excessive stack usage.
+\layout List
+\labelwidthstring 00.00.0000
+
+code
+\begin_inset LatexCommand \index{PIC16!Pragmas!\#pragma code}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ place a function symbol at static FLASH address
+\layout LyX-Code
+
+Example:
+\layout LyX-Code
+
+\layout LyX-Code
+
+/* place function test_func at 0x4000 */
+\layout LyX-Code
+
+#pragma code test_func 0x4000
+\layout LyX-Code
+
+\layout List
+\labelwidthstring 00.00.0000
+
+library instructs the linker to use a library module.
+\newline 
+Usage:
+\layout LyX-Code
+
+#pragma library module_name
 \layout Standard
 
-SIG_CCP1
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+
+\emph on 
+module_name
+\emph default 
+ can be any library or object file (including its path).
+ Note that there are four reserved keywords which have special meaning.
+ These are:
+\layout Standard
+\align center 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="block" valignment="top" leftline="true" width="20page%">
+<column alignment="left" 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
 
-CCP1 module interrupt
+Keyword
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SIG_AD
+Description
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21426,7 +21525,7 @@ SIG_AD
 
 \layout Standard
 
-AD convertion complete interrupt
+Module to link
 \end_inset 
 </cell>
 </row>
@@ -21436,23 +21535,17 @@ AD convertion complete interrupt
 
 \layout Standard
 
-SIG_CCP2
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-CCP2 module interrupt
+\series bold 
+ignore
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SIG_RC
+ignore all library pragmas
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21460,7 +21553,9 @@ SIG_RC
 
 \layout Standard
 
-USART receive interrupt
+
+\emph on 
+(none)
 \end_inset 
 </cell>
 </row>
@@ -21470,23 +21565,17 @@ USART receive interrupt
 
 \layout Standard
 
-SIG_TMR0
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-TMR0 overflow interrupt
+\series bold 
+c
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SIG_TX
+link the C library
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21494,7 +21583,11 @@ SIG_TX
 
 \layout Standard
 
-USART transmit interrupt
+
+\emph on 
+libc18f
+\emph default 
+.lib
 \end_inset 
 </cell>
 </row>
@@ -21504,23 +21597,17 @@ USART transmit interrupt
 
 \layout Standard
 
-SIG_TMR1
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-TMR1 overflow interrupt
+\series bold 
+math
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-SIG_MSSP
+link the Math libarary
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21528,7 +21615,11 @@ SIG_MSSP
 
 \layout Standard
 
-SSP receive/transmit interrupt
+
+\emph on 
+libm18f
+\emph default 
+.lib
 \end_inset 
 </cell>
 </row>
@@ -21538,22 +21629,17 @@ SSP receive/transmit interrupt
 
 \layout Standard
 
-SIG_TMR2
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-TMR2 matches PR2 interrupt
+\series bold 
+io
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+link the I/O library
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21561,6 +21647,11 @@ TMR2 matches PR2 interrupt
 
 \layout Standard
 
+
+\emph on 
+libio18f*
+\emph default 
+.lib
 \end_inset 
 </cell>
 </row>
@@ -21570,22 +21661,17 @@ TMR2 matches PR2 interrupt
 
 \layout Standard
 
-SIG_TMR3
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
-TMR3 overflow interrupt
+\series bold 
+debug
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+link the debug library
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -21593,6 +21679,11 @@ TMR3 overflow interrupt
 
 \layout Standard
 
+
+\emph on 
+libdebug
+\emph default 
+.lib
 \end_inset 
 </cell>
 </row>
@@ -21601,1067 +21692,3239 @@ TMR3 overflow interrupt
 \end_inset 
 
 
+\newline 
+* is the device number, i.e.
+ 452 for PIC18F452 MCU.
 \layout Standard
 
-The prototypes for these names are defined in the header file 
-\emph on 
-signal.h
-\emph default 
- .
-\layout Standard
-
-In order to simplify signal handling, a number of macros is provided:
+This feature allows for linking with specific libraries withoug having to
+ explicit name them in the command line.
+ Note that the 
+\noun on 
+ignore
+\noun default 
+ keyword will reject all modules specified by the library pragma.
 \layout List
 \labelwidthstring 00.00.0000
 
-DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for
- high priority interrupts.
-\emph on 
-name
-\emph default 
- is the function name to use.
-\layout List
-\labelwidthstring 00.00.0000
-
-DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo
- low priority interrupt.
-\emph on 
-name
-\emph default 
- is the function name to use.
-\layout List
-\labelwidthstring 00.00.0000
-
-DEF_HANDLER(sig,handler) define a handler for signal 
-\emph on 
-sig.
-\layout List
-\labelwidthstring 00.00.0000
+udata pragma udata instructs the compiler to emit code so that linker will
+ place a variable at a specific memory bank
+\layout LyX-Code
 
-END_DEF end the declaration of the dispatch table.
-\layout Standard
+Example:
+\layout LyX-Code
 
-Additionally there are two more macros to simplify the declaration of the
- signal handler:
-\layout List
-\labelwidthstring 00.00.0000
+\layout LyX-Code
 
+/* places variable foo at bank2 */
+\layout LyX-Code
 
-\series medium 
-SIGHANDLER(handler) 
-\series default 
-this declares the function prototype for the 
-\emph on 
-handler
-\emph default 
- function.
-\layout List
-\labelwidthstring 00.00.0000
+#pragma udata bank2 foo
+\layout LyX-Code
 
-SIGHANDLERNAKED(handler) same as SIGHANDLER() but declares a naked function.
+char foo;
 \layout Standard
 
-An example of using the macros above is shown below:
+In order for this pragma to work extra SECTION directives should be added
+ in the .lkr script.
+ In the following example a sample .lkr file is shown:
 \layout LyX-Code
 
-#include <pic18fregs.h>
 \layout LyX-Code
 
-#include <signal.h>
-\newline 
-
-\newline 
-DEF_INTHIGH(high_int)
+// Sample linker script for the PIC18F452 processor
 \layout LyX-Code
 
-DEF_HANDLER(SIG_TMR0, _tmr0_handler)
+LIBPATH .
 \layout LyX-Code
 
-DEF_HANDLER(SIG_BCOL, _bcol_handler)
+CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
 \layout LyX-Code
 
-END_DEF
-\newline 
+CODEPAGE   NAME=page       START=0x2A           END=0x7FFF
+\layout LyX-Code
 
-\newline 
-SIGHANDLER(_tmr0_handler)
+CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
 \layout LyX-Code
 
-{
+CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
 \layout LyX-Code
 
-  /* action to be taken when timer 0 overflows */
+CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
 \layout LyX-Code
 
-}
-\newline 
+CODEPAGE   NAME=eedata     START=0xF00000       END=0xF000FF       PROTECTED
+\layout LyX-Code
 
-\newline 
-SIGHANDLERNAKED(_bcol_handler)
+ACCESSBANK NAME=accessram  START=0x0            END=0x7F
 \layout LyX-Code
 
-{
 \layout LyX-Code
 
-  _asm
+DATABANK   NAME=gpr0       START=0x80           END=0xFF
 \layout LyX-Code
 
-    /* action to be taken when bus collision occurs */
+DATABANK   NAME=gpr1       START=0x100          END=0x1FF
 \layout LyX-Code
 
-    retfie
+DATABANK   NAME=gpr2       START=0x200          END=0x2FF
 \layout LyX-Code
 
- _endasm;
+DATABANK   NAME=gpr3       START=0x300          END=0x3FF
 \layout LyX-Code
 
-}
-\layout Standard
+DATABANK   NAME=gpr4       START=0x400          END=0x4FF
+\layout LyX-Code
 
+DATABANK   NAME=gpr5       START=0x500          END=0x5FF
+\layout LyX-Code
 
-\series bold 
-NOTES:
-\series default 
- Special care should be taken when using the above scheme:
-\layout Itemize
+ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED
+\layout LyX-Code
 
-do not place a colon (;) at the end of the DEF_* and END_DEF macros.
-\layout Itemize
+\layout LyX-Code
 
-when declaring SIGHANDLERNAKED handler never forget to use 
-\emph on 
-retfie
-\emph default 
- for proper returning.
-\layout Subsection
+SECTION    NAME=CONFIG     ROM=config
+\layout LyX-Code
 
-PIC16 Port -- Tips
-\layout Standard
+\layout LyX-Code
 
-Here you can find some general tips for compiling programs with SDCC/pic16.
-\layout Subsubsection
+SECTION    NAME=bank0      RAM=gpr0       # these SECTION directives
+\layout LyX-Code
 
-Stack size
-\layout Standard
+SECTION    NAME=bank1      RAM=gpr1       # should be added to link
+\layout LyX-Code
 
-The default stack
-\begin_inset LatexCommand \index{PIC16!stack}
+SECTION    NAME=bank2      RAM=gpr2       # section name 'bank?' with
+\layout LyX-Code
 
-\end_inset 
+SECTION    NAME=bank3      RAM=gpr3       # a specific DATABANK name
+\layout LyX-Code
 
- size (that is 64 bytes) probably is enough for many programs.
- One must take care that when there are many levels of function nesting,
- or there is excessive usage of stack, its size should be extended.
- An example of such a case is the printf/sprintf family of functions.
- If you encounter problems like not being able to print integers, then you
- need to set the stack size around the maximum (256 for small stack model).
- The following diagram shows what happens when calling printf to print an
- integer:
+SECTION    NAME=bank4      RAM=gpr4
 \layout LyX-Code
 
-printf () --> ltoa () --> ultoa () --> divschar ()
+SECTION    NAME=bank5      RAM=gpr5
 \layout Standard
 
-It is should be understood that stack is easily consumed when calling complicate
-d functions.
- Using command line arguments like -
-\begin_inset ERT
-status Collapsed
+The linker will recognise the section name set in the pragma statement and
+ will position the variable at the memory bank set with the RAM field at
+ the SECTION line in the linker script file.
+\layout Subsection
 
-\layout Standard
+Header Files
+\begin_inset LatexCommand \label{sub:PIC16_Header-Files}
 
-\backslash 
-/
 \end_inset 
 
--fommit-frame-pointer might reduce stack usage by not creating unnecessery
- stack frames.
- Other ways to reduce stack usage may exist.
-\layout Subsection
 
-Known bugs
 \layout Standard
 
-The PIC16 Port currently does not pass SDCC's regression test
-\begin_inset LatexCommand \index{Regression test (PIC16)}
+There is one main header file
+\begin_inset LatexCommand \index{PIC16!Header files}
 
 \end_inset 
 
- suite (see section 
-\begin_inset LatexCommand \ref{sec:Quality-control}
+ that can be included to the source files using the pic16
+\begin_inset LatexCommand \index{PIC16}
 
 \end_inset 
 
-) and thus the nightly regression tests for the PIC16 target are currently
- disabled for all hosts except for 
-\emph on 
-Linux on Opteron.
-
-\emph default 
- This means you can see the result of the PIC16 regression tests f.e.
- by checking the log files in 
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/regression_test_results/amd64-unknown-linux2.3/}
+ port.
+ That file is the 
+\series bold 
+pic18fregs.h
+\series default 
+.
+ This header file contains the definitions for the processor special registers,
+ so it is necessary if the source accesses them.
+ It can be included by adding the following line in the beginning of the
+ file:
+\layout LyX-Code
 
-\end_inset 
+#include <pic18fregs.h>
+\layout Standard
 
- (pick the most up to date file there, scroll down, lend a hand).
-\layout Chapter
+The specific microcontroller is selected within the pic18fregs.h automatically,
+ so the same source can be used with a variety of devices.
+\layout Subsection
 
-Debugging
+Libraries
 \layout Standard
 
-There are several approaches to debugging your code.
- This chapter is meant to show your options and to give detail on some of
- them:
-\newline 
-
-\newline 
-When writing your code:
-\layout Itemize
+The libraries
+\begin_inset LatexCommand \index{PIC16!Libraries}
 
-write your code with debugging in mind (avoid duplicating code, put conceptually
- similar variables into structs, use structured code, have strategic points
- within your code where all variables are consistent, ...)
-\layout Itemize
+\end_inset 
 
-run a syntax-checking tool like splint
-\begin_inset LatexCommand \index{splint (syntax checking tool)}
+ that PIC16
+\begin_inset LatexCommand \index{PIC16}
 
 \end_inset 
 
+ port depends on are the microcontroller device libraries which contain
+ the symbol definitions for the microcontroller special function registers.
+ These libraries have the format pic18fxxxx.lib, where 
+\emph on 
+xxxx
+\emph default 
+ is the microcontroller identification number.
+ The specific library is selected automatically by the compiler at link
+ stage according to the selected device.
+\layout Standard
 
-\begin_inset LatexCommand \index{lint (syntax checking tool)}
+Libraries are created with gplib which is part of the gputils package 
+\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
 
 \end_inset 
 
- (see -
-\begin_inset ERT
-status Collapsed
+.
+\layout Subsubsection*
 
+Building the libraries
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--more-pedantic 
-\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+Before using SDCC/pic16 there are some libraries that need to be compiled.
+ This process is not done automatically by SDCC since not all users use
+ SDCC for pic16 projects.
+ So each user should compile the libraries separately.
+\layout Standard
 
-\end_inset 
+The steps to compile the pic16 libraries under Linux are:
+\layout LyX-Code
 
-) over the code.
-\layout Itemize
+cd device/lib/pic16
+\layout LyX-Code
 
-for the high level code use a C-compiler (like f.e.
- GCC) to compile run and debug the code on your host.
- See (see -
-\begin_inset ERT
-status Collapsed
+./configure
+\layout LyX-Code
+
+make
+\layout LyX-Code
+
+cd ..
+\layout LyX-Code
+
+make model-pic16
+\layout LyX-Code
 
+su -c 'make install'     # install the libraries, you need the root password
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+If you need to install the headers too, do:
+\layout LyX-Code
 
--more-pedantic 
-\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+cd device/include
+\layout LyX-Code
 
-\end_inset 
+su -c 'make install'     # install the headers, you need the root password
+\layout Standard
 
- ) on howto handle syntax extensions like __xdata, __at(), ...
-\layout Itemize
+There exist a special target to build the I/O libraries.
+ This target is not automatically build because it will build the I/O library
+ for 
+\emph on 
+every
+\emph default 
+ supported device.
+ This way building will take quite a lot of time.
+ Users are advised to edit the 
+\series bold 
+device/lib/pic16/pics.build
+\series default 
+ file and then execute:
+\layout LyX-Code
 
-use another C-compiler to compile code for your target.
- Always an option but not recommended:) And not very likely to help you.
- If you seriously consider walking this path you should at least occasionally
- check portability of your code.
- Most commercial compiler vendors will offer an evaluation version so you
- can test compile your code or snippets of your code.
+make lib-io
+\layout Subsection
+
+Memory Models
 \layout Standard
 
-Debugging on a simulator:
+The following memory models are supported by the PIC16 port:
 \layout Itemize
 
-there is a separate section about SDCDB (section 
-\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
+small model
+\layout Itemize
 
-\end_inset 
+large model
+\layout Standard
 
-) below.
-\layout Itemize
+Memory model affects the default size of pointers within the source.
+ The sizes are shown in the next table:
+\layout Standard
+\align center 
 
-or (8051 specific) use a freeware/commercial simulator which interfaces
- to the AOMF
-\begin_inset LatexCommand \index{AOMF, AOMF51}
+\begin_inset  Tabular
+<lyxtabular version="3" rows="3" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<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
 
+Pointer sizes according to memory model
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- file (see 
-\begin_inset LatexCommand \ref{OMF file}
+\layout Standard
 
+small model
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-) optionally generated by SDCC.
 \layout Standard
 
-Debugging On-target: 
-\layout Itemize
-
-use a MCU port pin to serially output debug data to the RS232 port of your
- host.
- You'll probably want some level shifting device typically involving a MAX232
- or similar IC.
- If the hardware serial port of the MCU is not available search for 'Software
- UART' in your favourite search machine.
-\layout Itemize
+large model
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-use an on-target monitor.
- In this context a monitor is a small program which usually accepts commands
- via a serial line and allows to set program counter, to single step through
- a program and read/write memory locations.
- For the 8051 good examples of monitors are paulmon and cmon51 (see section
-\begin_inset LatexCommand \ref{sec:Related-open-source-tools}
+\layout Standard
 
+code pointers
 \end_inset 
+</cell>
+<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-).
-\layout Itemize
+\layout Standard
 
-toggle MCU port pins at strategic points within your code and use an oscilloscop
-e.
- A 
-\emph on 
-digital oscilloscope
-\emph default 
+16-bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\begin_inset LatexCommand \index{Oscilloscope}
+\layout Standard
 
+24-bits
 \end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- with deep trace memory is really helpful especially if you have to debug
- a realtime application.
- If you need to monitor more pins than your oscilloscope provides you can
- sometimes get away with a small R-2R network.
- On a single channel oscilloscope you could f.e.
- monitor 2 push-pull driven pins by connecting one via a 10\SpecialChar ~
-k
-\begin_inset Formula $\Omega$
-\end_inset 
+\layout Standard
 
- resistor and the other one by a 5\SpecialChar ~
-k
-\begin_inset Formula $\Omega$
+data pointers
 \end_inset 
+</cell>
+<cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- resistor to the oscilloscope probe (check output drive capability of the
- pins you want to monitor).
- If you need to monitor many more pins a 
-\emph on 
-logic analyzer
-\emph default 
- will be handy.
-\layout Itemize
-
-use an ICE (
-\emph on 
-i
-\emph default 
-n 
-\emph on 
-c
-\emph default 
-ircuit 
-\emph on 
-e
-\emph default 
-mulator
-\begin_inset LatexCommand \index{ICE (in circuit emulator)}
+\layout Standard
 
+16-bits
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-).
- Usually very expensive.
- And very nice to have too.
- And usually locks you (for years...) to the devices the ICE can emulate.
-\layout Itemize
-
-use a remote debugger.
- In most 8-bit systems the symbol information is not available on the target,
- and a complete debugger is too bulky for the target system.
- Therefore usually a debugger on the host system connects to an on-target
- debugging stub which accepts only primitive commands.
-\newline 
-Terms to enter into your favourite search engine could be 'remote debugging',
- 'gdb stub' or 'inferior debugger'.
- (is there one?)
-\layout Itemize
+\layout Standard
 
-use an on target hardware debugger.
- Some of the more modern MCUs include hardware support for setting break
- points and monitoring/changing variables by using dedicated hardware pins.
- This facility doesn't require additional code to run on the target and
-\emph on 
-usually
-\emph default 
- doesn't affect runtime behaviour until a breakpoint is hit.
- For the mcs51 most hardware debuggers use the AOMF
-\begin_inset LatexCommand \index{AOMF, AOMF51}
+16-bits
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
 \end_inset 
 
- file (see 
-\begin_inset LatexCommand \ref{OMF file}
 
-\end_inset 
+\layout Standard
 
-) as input file.
+It is advisable that all sources within a project are compiled with the
+ same memory model.
+ If one wants to override the default memory model, this can be done by
+ declaring a pointer as 
+\series bold 
+far
+\series default 
+ or 
+\series bold 
+near
+\series default 
+.
+ Far selects large memory model's pointers, while near selects small memory
+ model's pointers.
 \layout Standard
 
-Last not least:
-\layout Itemize
+The standard device libraries (see 
+\begin_inset LatexCommand \ref{sub:PIC16_Header-Files}
 
-if you are not familiar with any of the following terms you're likely to
- run into problems rather sooner than later: 
-\emph on 
-volatile
-\emph default 
-, 
-\emph on 
-atomic
-\emph default 
-, 
-\emph on 
-memory map
-\emph default 
-, 
-\emph on 
-overlay
-\emph default 
-.
- As an embedded programmer you 
-\emph on 
-have
-\emph default 
- to know them so why not look them up 
-\emph on 
-before
-\emph default 
- you have problems?)
-\layout Itemize
+\end_inset 
 
-tell someone else about your problem (actually this is a surprisingly effective
- means to hunt down the bug even if the listener is not familiar with your
- environment).
- As 'failure to communicate' is probably one of the job-induced deformations
- of an embedded programmer this is highly encouraged.
-\layout Section
+) contain no reference to pointers, so they can be used with both memory
+ models.
+\layout Subsection
 
-Debugging with SDCDB
-\begin_inset LatexCommand \label{cha:Debugging-with-SDCDB}
+Stack
+\layout Standard
 
-\end_inset 
+The stack
+\begin_inset LatexCommand \index{PIC16!stack}
 
+\end_inset 
 
-\begin_inset LatexCommand \index{SDCDB (debugger)}
+ implementation for the PIC16 port uses two indirect registers, FSR1 and
+ FSR2.
+\layout List
+\labelwidthstring 00.00.0000
 
-\end_inset 
+FSR1 is assigned as stack pointer
+\layout List
+\labelwidthstring 00.00.0000
 
+FSR2 is assigned as frame pointer
 \layout Standard
 
-SDCC is distributed with a source level debugger
-\begin_inset LatexCommand \index{Debugger}
+The following stack models are supported by the PIC16 port
+\layout Itemize
 
-\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}
+\noun on 
+small
+\noun default 
+ model
+\layout Itemize
 
-\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.
-\layout Subsection
+\noun on 
+large
+\noun default 
+ model
+\layout Standard
 
-Compiling for Debugging
+
+\noun on 
+Small
+\noun default 
+ model means that only the FSRxL byte is used to access stack and frame,
+ while 
+\emph on 
+\noun on 
+large
+\emph default 
+\noun default 
+ uses both FSRxL and FSRxH registers.
+ The following table shows the stack/frame pointers sizes according to stack
+ model and the maximum space they can address:
 \layout Standard
+\align center 
 
-The -
-\begin_inset ERT
-status Collapsed
+\begin_inset  Tabular
+<lyxtabular version="3" rows="3" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<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
 
-\backslash 
-/
+Stack & Frame pointer sizes according to stack model
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
--debug
-\begin_inset LatexCommand \index{-\/-debug}
+\layout Standard
 
+small
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- option must be specified for all files for which debug information is to
- be generated.
- The compiler generates a .adb file for each of these files.
- The linker creates the .cdb
-\begin_inset LatexCommand \index{<file>.cdb}
+\layout Standard
 
+large
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- file from the .adb
-\begin_inset LatexCommand \index{<file>.adb}
+\layout Standard
 
+Stack pointer FSR1
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- 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
+8-bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+16-bits
 \end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
--debug option is specified the compiler generates extra symbol information
- some of which are put into the assembler source and some are put into the
- .adb file.
- Then the linker creates the .cdb file from the individual .adb files with
- the address information for the symbols.
- The debugger reads the symbolic information generated by the compiler &
- the address information generated by the linker.
- It uses the SIMULATOR (Daniel's S51) to execute the program, the program
- execution is controlled by the debugger.
- When a command is issued for the debugger, it translates it into appropriate
- commands for the simulator.
- (Currently SDCDM only connects to the simulator but 
-\emph on 
-newcdb
-\emph default 
- at 
-\begin_inset LatexCommand \url{http://ec2drv.sf.net/}
+\layout Standard
 
+Frame pointer FSR2
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- is an effort to connect directly to the hardware.) 
-\layout Subsection
-
-Starting the Debugger SDCDB
 \layout Standard
 
-The debugger can be started using the following command line.
- (Assume the file you are debugging has the file name foo).
-\newline 
+8-bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
+\layout Standard
 
-\family sans 
-\series bold 
-sdcdb foo
-\newline 
+16-bits
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
-\family default 
-\series default 
+\end_inset 
 
-\newline 
-The debugger will look for the following files.
-\layout Itemize
 
-foo.c - the source file.
-\layout Itemize
+\layout Standard
 
-foo.cdb - the debugger symbol information file.
-\layout Itemize
 
-foo.ihx - the Intel hex format
-\begin_inset LatexCommand \index{Intel hex format}
+\noun on 
+Large 
+\noun default 
+stack model is currently not working properly throughout the code generator.
+ So its use is not advised.
+ Also there are some other points that need special care:
+\newline 
 
-\end_inset 
+\layout Enumerate
 
- object file.
-\layout Subsection
+Do not create stack sections with size more than one physical bank (that
+ is 256 bytes)
+\layout Enumerate
 
-SDCDB Command Line Options
-\layout Itemize
+Stack sections should no cross physical bank limits (i.e.
+ #pragma stack 0x50 0x100)
+\layout Standard
 
--
-\begin_inset ERT
-status Collapsed
+These limitations are caused by the fact that only FSRxL is modified when
+ using SMALL stack model, so no more than 256 bytes of stack can be used.
+ This problem will disappear after LARGE model is fully implemented.
+\layout Subsection
 
+Functions
 \layout Standard
 
-\backslash 
-/
+In addition to the standard SDCC function keywords, PIC16
+\begin_inset LatexCommand \index{PIC16}
+
 \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
+ port makes available two more:
+\layout List
+\labelwidthstring 00.00.0000
 
-\layout Standard
+wparam
+\begin_inset LatexCommand \index{PIC16!wparam}
 
-\backslash 
-/
 \end_inset 
 
--directory option should be -
-\begin_inset ERT
-status Collapsed
+ Use the WREG to pass one byte of the first function argument.
+ This improves speed but you may not use this for functions with arguments
+ that are called via function pointers, otherwise the first byte of the
+ first parameter will get lost.
+ Usage:
+\layout LyX-Code
 
-\layout Standard
+void func_wparam(int a) wparam
+\layout LyX-Code
 
-\backslash 
-/
-\end_inset 
+{
+\layout LyX-Code
 
--directory=/home/src1:/home/src2.
- Note there can be no spaces in the option.
-\layout Itemize
+    /* WREG hold the lower part of a */
+\layout LyX-Code
 
--cd <directory> - change to the <directory>.
-\layout Itemize
+    /* the high part of a is stored in FSR2+2 (or +3 for large stack model)
+ */
+\layout LyX-Code
 
--fullname - used by GUI front ends.
-\layout Itemize
+...
+\layout LyX-Code
 
--cpu <cpu-type> - this argument is passed to the simulator please see the
- simulator docs for details.
-\layout Itemize
+}
+\layout List
+\labelwidthstring 00.00.0000
 
--X <Clock frequency > this options is passed to the simulator please see
- the simulator docs for details.
-\layout Itemize
+shadowregs
+\begin_inset LatexCommand \index{PIC16!shadowregs}
 
--s <serial port file> passed to simulator see the simulator docs for details.
-\layout Itemize
+\end_inset 
 
--S <serial in,out> passed to simulator see the simulator docs for details.
-\layout Itemize
+ When entering/exiting an ISR, it is possible to take advantage of the PIC18F
+ hardware shadow registers which hold the values of WREG, STATUS and BSR
+ registers.
+ This can be done by adding the keyword 
+\emph on 
+shadowregs
+\emph default 
+ before the 
+\emph on 
+interrupt
+\emph default 
+ keyword in the function's header.
+\layout LyX-Code
 
--k <port number> passed to simulator see the simulator docs for details.
-\layout Subsection
+void isr_shadow(void) shadowregs interrupt 1
+\layout LyX-Code
 
-SDCDB Debugger Commands
-\layout Standard
+{
+\layout LyX-Code
 
-As mentioned earlier the command interface for the debugger has been deliberatel
-y kept as close the GNU debugger gdb, as possible.
- This will help the integration with existing graphical user interfaces
- (like ddd, xxgdb or xemacs) existing for the GNU debugger.
- If you use a graphical user interface for the debugger you can skip this
- section.
-\layout Subsubsection*
+...
+\layout LyX-Code
 
-break [line | file:line | function | file:function]
+}
 \layout Standard
 
-Set breakpoint at specified line or function:
-\newline 
-
-\newline 
 
-\family sans 
-\series bold 
-sdcdb>break 100 
-\newline 
-sdcdb>break foo.c:100
-\newline 
-sdcdb>break funcfoo
-\newline 
-sdcdb>break foo.c:funcfoo
-\layout Subsubsection*
+\emph on 
+shadowregs
+\emph default 
+ instructs the code generator not to store/restore WREG, STATUS, BSR when
+ entering/exiting the ISR.
+\layout Subsection
 
-clear [line | file:line | function | file:function ]
+Function return values
 \layout Standard
 
-Clear breakpoint at specified line or function:
-\newline 
-
-\newline 
+Return values from functions are placed to the appropriate registers following
+ a modified Microchip policy optimized for SDCC.
+ The following table shows these registers:
+\layout Standard
+\align center 
 
-\family sans 
-\series bold 
-sdcdb>clear 100
-\newline 
-sdcdb>clear foo.c:100
-\newline 
-sdcdb>clear funcfoo
-\newline 
-sdcdb>clear foo.c:funcfoo
-\layout Subsubsection*
+\begin_inset  Tabular
+<lyxtabular version="3" rows="6" 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
 
-continue
 \layout Standard
 
-Continue program being debugged, after breakpoint.
-\layout Subsubsection*
+size
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-finish
 \layout Standard
 
-Execute till the end of the current function.
-\layout Subsubsection*
+destination register
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-delete [n]
 \layout Standard
 
-Delete breakpoint number 'n'.
- If used without any option clear ALL user defined break points.
-\layout Subsubsection*
-
-info [break | stack | frame | registers ]
-\layout Itemize
+8 bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-info break - list all breakpoints
-\layout Itemize
+\layout Standard
 
-info stack - show the function call stack.
-\layout Itemize
+WREG
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-info frame - show information about the current execution frame.
-\layout Itemize
+\layout Standard
 
-info registers - show content of all registers.
-\layout Subsubsection*
+16 bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-step
 \layout Standard
 
-Step program until it reaches a different source line.
- Note: pressing <return> repeats the last command.
-\layout Subsubsection*
+PRODL:WREG
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-next
 \layout Standard
 
-Step program, proceeding through subroutine calls.
-\layout Subsubsection*
+24 bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-run
 \layout Standard
 
-Start debugged program.
-\layout Subsubsection*
+PRODH:PRODL:WREG
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-ptype variable 
 \layout Standard
 
-Print type information of the variable.
-\layout Subsubsection*
+32 bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-print variable
 \layout Standard
 
-print value of variable.
-\layout Subsubsection*
+FSR0L:PRODH:PRODL:WREG
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-file filename
 \layout Standard
 
-load the given file name.
- Note this is an alternate method of loading file for debugging.
-\layout Subsubsection*
+>32 bits
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-frame
 \layout Standard
 
-print information about current frame.
-\layout Subsubsection*
-
-set srcmode
-\layout Standard
+on stack, FSR0 points to the beginning
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
-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*
+\layout Subsection
 
-quit
+Interrupts
 \layout Standard
 
-"Watch me now.
- Iam going Down.
- My name is Bobby Brown"
-\layout Subsection
-
-Interfacing SDCDB with DDD
-\layout Comment
+An interrupt
+\begin_inset LatexCommand \index{PIC16!interrupt}
 
-The screenshot was converted from png to eps with: 
-\begin_inset Quotes sld
 \end_inset 
 
-bmeps -c -e8f -p3 ddd_example.png >ddd_example.eps
-\begin_inset Quotes srd
-\end_inset 
+ service routine (ISR) is declared using the 
+\emph on 
+interrupt
+\emph default 
+ keyword.
+\layout LyX-Code
 
- which produces a pretty compact eps file which is free from compression
- artifacts.
-\layout Comment
+void isr(void) interrupt 
+\emph on 
+n
+\layout LyX-Code
 
-The screenshot was included in sdccman.lyx cvs version 1.120 but later removed
- as this broke the build system on Sourceforge (pdf-file was broken.
- pdflatex does not accept eps files).
+{
+\layout LyX-Code
+
+...
+\layout LyX-Code
+
+}
 \layout Standard
 
-The 
-\emph on 
-p
-\emph default 
-ortable 
+
 \emph on 
 n
 \emph default 
-etwork 
-\emph on 
-g
-\emph default 
-raphics File 
-\size footnotesize 
-
-\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png}
+ is the interrupt number, which for PIC18F devices can be:
+\layout Standard
+\align center 
 
-\end_inset 
+\begin_inset  Tabular
+<lyxtabular version="3" rows="4" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<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
 
-\size default 
- shows a screenshot of a debugging session with DDD
-\begin_inset LatexCommand \index{DDD (debugger)}
 
+\emph on 
+n
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- (Unix only) on a simulated 8032.
- The debugging session might not run as smoothly as the screenshot suggests.
- The debugger allows setting of breakpoints, displaying and changing variables,
- single stepping through C and assembler code.
-\newline 
-The source was compiled with 
-\family sans 
-\series bold 
-
-\newline 
-
-\newline 
-sdcc -
-\family default 
-\series default 
+\layout Standard
 
-\begin_inset ERT
-status Collapsed
+Interrupt Vector
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+Interrupt Vector Address
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\family sans 
-\series bold 
--debug ddd_example.c
-\family default 
-\series default 
-\family sans 
-\series bold 
+0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
+\layout Standard
 
-\family default 
-\series default 
+RESET vector
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\newline 
-and DDD was invoked with 
-\family sans 
-\series bold 
+\layout Standard
 
-\newline 
+0x000000
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
-ddd -debugger 'sdcdb -cpu 8032 ddd_example'
-\layout Subsection
+\layout Standard
 
-Interfacing SDCDB with XEmacs
-\begin_inset LatexCommand \index{XEmacs}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+1
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{Emacs}
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+HIGH priority interrupts
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \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 
+0x000008
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
+\layout Standard
 
-\family typewriter 
-(load-file sdcdbsrc.el) 
-\family default 
+2
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
+\layout Standard
 
-\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: 
-\newline 
+LOW priority interrupts
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\newline 
+\layout Standard
 
-\family sans 
-\series bold 
-ESC-x sdcdbsrc
-\family default 
-\series default 
+0x000018
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
 
-\newline 
+\end_inset 
 
-\newline 
-You will prompted to enter the file name to be debugged.
-\newline 
 
-\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
+\layout Standard
 
-sdcdbsrc-cpu-type '51
+When generating assembly code for ISR the code generator places a 
+\noun on 
+goto 
+\noun default 
+instruction at the 
+\emph on 
+Interrupt Vector Address
+\emph default 
+ which points at the genetated ISR.
+ This single GOTO instruction is part of an automatically generated 
+\emph on 
+interrupt entry point
+\emph default 
+ function.
+ The actuall ISR code is placed as normally would in the code space.
+ Upon interrupt request, the GOTO instruction is executed which jumps to
+ the ISR code.
+ When declaring interrupt functions as _naked this GOTO instruction is 
+\series bold 
+not
+\series default 
+ generated.
+ The whole interrupt functions is therefore placed at the Interrupt Vector
+ Address of the specific interrupt.
+ This is not a problem for the LOW priority interrupts, but it is a problem
+ for the RESET and the HIGH priority interrupts because code may be written
+ at the next interrupt´s vector address and cause undeterminate program
+ behaviour if that interrupt is raised.
+\begin_inset Foot
+collapsed false
+
+\layout Standard
+
+This is not a problem when
+\layout Enumerate
+
+this is a HIGH interrupt ISR and LOW interrupts are 
+\emph on 
+disabled
+\emph default 
+ or not used.
+\layout Enumerate
+
+when the ISR is small enough not to reach the next interrupt´s vector address.
+\end_inset 
+
+
+\layout Standard
+
+
+\emph on 
+n
+\emph default 
+ is possible to be omitted.
+ This way a function is generated similar to an ISR, but it is not assigned
+ to any interrupt.
+\layout Standard
+
+When entering an interrupt, currently the PIC16
+\begin_inset LatexCommand \index{PIC16}
+
+\end_inset 
+
+ port automatically saves the following registers:
 \layout Itemize
 
-sdcdbsrc-frequency '11059200
+WREG
 \layout Itemize
 
-sdcdbsrc-serial nil
+STATUS
+\layout Itemize
+
+BSR
+\layout Itemize
+
+PROD (PRODL and PRODH)
+\layout Itemize
+
+FSR0 (FSR0L and FSR0H)
 \layout Standard
 
-The following is a list of key mapping for the debugger interface.
+These registers are restored upon return from the interrupt routine.
+\begin_inset Foot
+collapsed false
+
+\layout Standard
+
+NOTE that when the _naked attribute is specified for an interrupt routine,
+ then NO registers are stored or restored.
+\end_inset 
+
+
+\layout Subsection
+
+Generic Pointers
+\layout Standard
+
+Generic pointers are implemented in PIC16 port as 3-byte (24-bit) types.
+ There are 3 types of generic pointers currently implemented data, code
+ and eeprom pointers.
+ They are differentiated by the value of the 7th and 6th bits of the upper
+ byte:
+\layout Standard
+\align center 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="5" columns="5">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="left" valignment="top" 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
+
+pointer type
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+7th bit
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+6th bit
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+rest of the pointer
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+description
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+data 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
-\SpecialChar ~
 
 \family typewriter 
+\shape slanted 
+\emph on 
+uuuuuu uuuuxxxx xxxxxxxx
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\newline 
-;;\SpecialChar ~
-Current Listing :: 
-\newline 
-;;key\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-binding\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-Comment 
-\newline 
-;;---\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
--------\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+\layout Standard
+
+a 12-bit data pointer in data RAM memory
+\end_inset 
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+code
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+\shape slanted 
+\emph on 
+uxxxxx xxxxxxxx xxxxxxxx
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+a 21-bit code pointer in FLASH memory
+\end_inset 
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+eeprom
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+\shape slanted 
+\emph on 
+uuuuuu uuuuuuxx xxxxxxxx
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+a 10-bit eeprom pointer in EEPROM memory
+\end_inset 
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+(unimplemented)
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+\shape slanted 
+\emph on 
+xxxxxx xxxxxxxx xxxxxxxx
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+unimplemented pointer type
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset 
+
+
+\layout Standard
+
+Generic pointer are read and written with a set of library functions which
+ read/write 1, 2, 3, 4 bytes.
+\layout Subsection
+
+PIC16 C Libraries
+\layout Subsubsection
+
+Standard I/O Streams
+\layout Standard
+
+In the 
+\emph on 
+stdio.h
+\emph default 
+ the type FILE is defined as:
+\layout LyX-Code
+
+typedef char * FILE;
+\layout Standard
+
+This type is the stream type implemented I/O in the PIC18F devices.
+ Also the standard input and output streams are declared in stdio.h:
+\layout LyX-Code
+
+extern FILE * stdin;
+\layout LyX-Code
+
+extern FILE * stdout;
+\layout Standard
+
+The FILE type is actually a generic pointer which defines one more type
+ of generic pointers, the 
+\emph on 
+stream 
+\emph default 
+pointer.
+ This new type has the format:
+\layout Standard
+\align center 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="2" columns="7">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="left" valignment="top" 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
+
+pointer type
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+<7:6>
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+<5>
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+<4>
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+<3:0>
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+rest of the pointer
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+descrption
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+stream
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+00
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+nnnn
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+\shape slanted 
+\emph on 
+uuuuuuuu uuuuuuuu
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+upper byte high nubble is 0x2n, the rest are zeroes
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset 
+
+
+\layout Standard
+
+Currently implemented there are 3 types of streams defined:
+\layout Standard
+\align center 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="4" columns="4">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<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
+
+stream type
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+value
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+module
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+description
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+STREAM_USART
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+0x200000UL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+USART
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Writes/Reads characters via the USART peripheral
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+STREAM_MSSP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+0x210000UL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+MSSP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Writes/Reads characters via the MSSP peripheral
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+STREAM_USER
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\family typewriter 
+0x2f0000UL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+(none)
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Writes/Reads characters via used defined functions
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset 
+
+
+\layout Standard
+
+The stream identifiers are declared as macros in the stdio.h header.
+\layout Standard
+
+In the libc library there exist the functions that are used to write to
+ each of the above streams.
+ These are
+\layout List
+\labelwidthstring 00.00.0000
+
+_
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+_stream_usart_putchar writes a character at the USART stream
+\layout List
+\labelwidthstring 00.00.0000
+
+_
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+_stream_mssp_putchar writes a character at the MSSP stream
+\layout List
+\labelwidthstring 00.00.0000
+
+putchar dummy function.
+ This writes a character to a user specified manner.
+\layout Standard
+
+In order to increase performance 
+\emph on 
+putchar 
+\emph default 
+is declared in stdio.h as having its parameter in WREG (it has the wparam
+ keyword).
+ In stdio.h exists the macro PUTCHAR(arg) that defines the putchar function
+ in a user-friendly way.
+\emph on 
+arg
+\emph default 
+ is the name of the variable that holds the character to print.
+ An example follows:
+\layout LyX-Code
+
+#include <pic18fregs.h>
+\newline 
+#include <stdio.h>
+\newline 
+
+\newline 
+PUTCHAR( c )
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+    PORTA = c;    /* dump character c to PORTA */
+\layout LyX-Code
+
+} 
+\newline 
+
+\newline 
+void main(void)
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+    stdout = STREAM_USER;    /* this is not necessary, since stdout points
+\layout LyX-Code
+
+                              * by default to STREAM_USER */
+\layout LyX-Code
+
+    printf (¨This is a printf test
+\backslash 
+n¨);
+\layout LyX-Code
+
+}
+\layout LyX-Code
+
+\layout Subsubsection
+
+Printing functions
+\layout Standard
+
+PIC16 contains an implementation of the printf-family of functions.
+ There exist the following functions:
+\layout LyX-Code
+
+extern unsigned int sprintf(char *buf, char *fmt, ...);
+\layout LyX-Code
+
+extern unsigned int vsprintf(char *buf, char *fmt, va_list ap);
+\layout LyX-Code
+
+\layout LyX-Code
+
+extern unsigned int printf(char *fmt, ...);
+\layout LyX-Code
+
+extern unsigned int vprintf(char *fmt, va_lista ap);
+\layout LyX-Code
+
+\layout LyX-Code
+
+extern unsigned int fprintf(FILE *fp, char *fmt, ...);
+\layout LyX-Code
+
+extern unsigned int vfprintf(FILE *fp, char *fmt, va_list ap);
+\layout Standard
+
+For sprintf and vsprintf 
+\emph on 
+buf 
+\emph default 
+should normally be a data pointer where the resulting string will be placed.
+ No range checking is done so the user should allocate the necessery buffer.
+ For fprintf and vfprintf 
+\emph on 
+fp
+\emph default 
+ should be a stream pointer (i.e.
+ stdout, STREAM_MSSP, etc...).
+\layout Subsubsection
+
+Signals
+\layout Standard
+
+The PIC18F family of microcontrollers supports a number of interrupt sources.
+ A list of these interrupts is shown in the following table:
+\layout Standard
+\align center 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="11" columns="4">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="left" 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
+
+signal name
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+description
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+signal name
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+descritpion
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_RB
+\end_inset 
+</cell>
+<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+PORTB change interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_EE
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+EEPROM/FLASH write complete interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_INT0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+INT0 external interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_BCOL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Bus collision interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_INT1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+INT1 external interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_LVD
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Low voltage detect interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_INT2
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+INT2 external interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_PSP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Parallel slave port interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_CCP1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+CCP1 module interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_AD
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+AD convertion complete interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_CCP2
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+CCP2 module interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_RC
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+USART receive interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_TMR0
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+TMR0 overflow interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_TX
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+USART transmit interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_TMR1
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+TMR1 overflow interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_MSSP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SSP receive/transmit interrupt
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_TMR2
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+TMR2 matches PR2 interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+\end_inset 
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+SIG_TMR3
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+TMR3 overflow interrupt
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset 
+
+
+\layout Standard
+
+The prototypes for these names are defined in the header file 
+\emph on 
+signal.h
+\emph default 
+ .
+\layout Standard
+
+In order to simplify signal handling, a number of macros is provided:
+\layout List
+\labelwidthstring 00.00.0000
+
+DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for
+ high priority interrupts.
+\emph on 
+name
+\emph default 
+ is the function name to use.
+\layout List
+\labelwidthstring 00.00.0000
+
+DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo
+ low priority interrupt.
+\emph on 
+name
+\emph default 
+ is the function name to use.
+\layout List
+\labelwidthstring 00.00.0000
+
+DEF_HANDLER(sig,handler) define a handler for signal 
+\emph on 
+sig.
+\layout List
+\labelwidthstring 00.00.0000
+
+END_DEF end the declaration of the dispatch table.
+\layout Standard
+
+Additionally there are two more macros to simplify the declaration of the
+ signal handler:
+\layout List
+\labelwidthstring 00.00.0000
+
+
+\series medium 
+SIGHANDLER(handler) 
+\series default 
+this declares the function prototype for the 
+\emph on 
+handler
+\emph default 
+ function.
+\layout List
+\labelwidthstring 00.00.0000
+
+SIGHANDLERNAKED(handler) same as SIGHANDLER() but declares a naked function.
+\layout Standard
+
+An example of using the macros above is shown below:
+\layout LyX-Code
+
+#include <pic18fregs.h>
+\layout LyX-Code
+
+#include <signal.h>
+\newline 
+
+\newline 
+DEF_INTHIGH(high_int)
+\layout LyX-Code
+
+DEF_HANDLER(SIG_TMR0, _tmr0_handler)
+\layout LyX-Code
+
+DEF_HANDLER(SIG_BCOL, _bcol_handler)
+\layout LyX-Code
+
+END_DEF
+\newline 
+
+\newline 
+SIGHANDLER(_tmr0_handler)
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+  /* action to be taken when timer 0 overflows */
+\layout LyX-Code
+
+}
+\newline 
+
+\newline 
+SIGHANDLERNAKED(_bcol_handler)
+\layout LyX-Code
+
+{
+\layout LyX-Code
+
+  _asm
+\layout LyX-Code
+
+    /* action to be taken when bus collision occurs */
+\layout LyX-Code
+
+    retfie
+\layout LyX-Code
+
+ _endasm;
+\layout LyX-Code
+
+}
+\layout Standard
+
+
+\series bold 
+NOTES:
+\series default 
+ Special care should be taken when using the above scheme:
+\layout Itemize
+
+do not place a colon (;) at the end of the DEF_* and END_DEF macros.
+\layout Itemize
+
+when declaring SIGHANDLERNAKED handler never forget to use 
+\emph on 
+retfie
+\emph default 
+ for proper returning.
+\layout Subsection
+
+PIC16 Port -- Tips
+\layout Standard
+
+Here you can find some general tips for compiling programs with SDCC/pic16.
+\layout Subsubsection
+
+Stack size
+\layout Standard
+
+The default stack
+\begin_inset LatexCommand \index{PIC16!stack}
+
+\end_inset 
+
+ size (that is 64 bytes) probably is enough for many programs.
+ One must take care that when there are many levels of function nesting,
+ or there is excessive usage of stack, its size should be extended.
+ An example of such a case is the printf/sprintf family of functions.
+ If you encounter problems like not being able to print integers, then you
+ need to set the stack size around the maximum (256 for small stack model).
+ The following diagram shows what happens when calling printf to print an
+ integer:
+\layout LyX-Code
+
+printf () --> ltoa () --> ultoa () --> divschar ()
+\layout Standard
+
+It is should be understood that stack is easily consumed when calling complicate
+d functions.
+ Using command line arguments like -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-fommit-frame-pointer might reduce stack usage by not creating unnecessery
+ stack frames.
+ Other ways to reduce stack usage may exist.
+\layout Subsection
+
+Known bugs
+\layout Standard
+
+The PIC16 Port currently does not pass SDCC's regression test
+\begin_inset LatexCommand \index{Regression test (PIC16)}
+
+\end_inset 
+
+ suite (see section 
+\begin_inset LatexCommand \ref{sec:Quality-control}
+
+\end_inset 
+
+) and thus the nightly regression tests for the PIC16 target are currently
+ disabled for all hosts except for 
+\emph on 
+Linux on Opteron.
+
+\emph default 
+ This means you can see the result of the PIC16 regression tests f.e.
+ by checking the log files in 
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/regression_test_results/amd64-unknown-linux2.3/}
+
+\end_inset 
+
+ (pick the most up to date file there, scroll down, lend a hand).
+\layout Chapter
+
+Debugging
+\layout Standard
+
+There are several approaches to debugging your code.
+ This chapter is meant to show your options and to give detail on some of
+ them:
+\newline 
+
+\newline 
+When writing your code:
+\layout Itemize
+
+write your code with debugging in mind (avoid duplicating code, put conceptually
+ similar variables into structs, use structured code, have strategic points
+ within your code where all variables are consistent, ...)
+\layout Itemize
+
+run a syntax-checking tool like splint
+\begin_inset LatexCommand \index{splint (syntax checking tool)}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{lint (syntax checking tool)}
+
+\end_inset 
+
+ (see -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-more-pedantic 
+\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+
+\end_inset 
+
+) over the code.
+\layout Itemize
+
+for the high level code use a C-compiler (like f.e.
+ GCC) to compile run and debug the code on your host.
+ See (see -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-more-pedantic 
+\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+
+\end_inset 
+
+ ) on howto handle syntax extensions like __xdata, __at(), ...
+\layout Itemize
+
+use another C-compiler to compile code for your target.
+ Always an option but not recommended:) And not very likely to help you.
+ If you seriously consider walking this path you should at least occasionally
+ check portability of your code.
+ Most commercial compiler vendors will offer an evaluation version so you
+ can test compile your code or snippets of your code.
+\layout Standard
+
+Debugging on a simulator:
+\layout Itemize
+
+there is a separate section about SDCDB (section 
+\begin_inset LatexCommand \ref{cha:Debugging-with-SDCDB}
+
+\end_inset 
+
+) below.
+\layout Itemize
+
+or (8051 specific) use a freeware/commercial simulator which interfaces
+ to the AOMF
+\begin_inset LatexCommand \index{AOMF, AOMF51}
+
+\end_inset 
+
+ file (see 
+\begin_inset LatexCommand \ref{OMF file}
+
+\end_inset 
+
+) optionally generated by SDCC.
+\layout Standard
+
+Debugging On-target: 
+\layout Itemize
+
+use a MCU port pin to serially output debug data to the RS232 port of your
+ host.
+ You'll probably want some level shifting device typically involving a MAX232
+ or similar IC.
+ If the hardware serial port of the MCU is not available search for 'Software
+ UART' in your favourite search machine.
+\layout Itemize
+
+use an on-target monitor.
+ In this context a monitor is a small program which usually accepts commands
+ via a serial line and allows to set program counter, to single step through
+ a program and read/write memory locations.
+ For the 8051 good examples of monitors are paulmon and cmon51 (see section
+\begin_inset LatexCommand \ref{sec:Related-open-source-tools}
+
+\end_inset 
+
+).
+\layout Itemize
+
+toggle MCU port pins at strategic points within your code and use an oscilloscop
+e.
+ A 
+\emph on 
+digital oscilloscope
+\emph default 
+
+\begin_inset LatexCommand \index{Oscilloscope}
+
+\end_inset 
+
+ with deep trace memory is really helpful especially if you have to debug
+ a realtime application.
+ If you need to monitor more pins than your oscilloscope provides you can
+ sometimes get away with a small R-2R network.
+ On a single channel oscilloscope you could f.e.
+ monitor 2 push-pull driven pins by connecting one via a 10\SpecialChar ~
+k
+\begin_inset Formula $\Omega$
+\end_inset 
+
+ resistor and the other one by a 5\SpecialChar ~
+k
+\begin_inset Formula $\Omega$
+\end_inset 
+
+ resistor to the oscilloscope probe (check output drive capability of the
+ pins you want to monitor).
+ If you need to monitor many more pins a 
+\emph on 
+logic analyzer
+\emph default 
+ will be handy.
+\layout Itemize
+
+use an ICE (
+\emph on 
+i
+\emph default 
+n 
+\emph on 
+c
+\emph default 
+ircuit 
+\emph on 
+e
+\emph default 
+mulator
+\begin_inset LatexCommand \index{ICE (in circuit emulator)}
+
+\end_inset 
+
+).
+ Usually very expensive.
+ And very nice to have too.
+ And usually locks you (for years...) to the devices the ICE can emulate.
+\layout Itemize
+
+use a remote debugger.
+ In most 8-bit systems the symbol information is not available on the target,
+ and a complete debugger is too bulky for the target system.
+ Therefore usually a debugger on the host system connects to an on-target
+ debugging stub which accepts only primitive commands.
+\newline 
+Terms to enter into your favourite search engine could be 'remote debugging',
+ 'gdb stub' or 'inferior debugger'.
+ (is there one?)
+\layout Itemize
+
+use an on target hardware debugger.
+ Some of the more modern MCUs include hardware support for setting break
+ points and monitoring/changing variables by using dedicated hardware pins.
+ This facility doesn't require additional code to run on the target and
+\emph on 
+usually
+\emph default 
+ doesn't affect runtime behaviour until a breakpoint is hit.
+ For the mcs51 most hardware debuggers use the AOMF
+\begin_inset LatexCommand \index{AOMF, AOMF51}
+
+\end_inset 
+
+ file (see 
+\begin_inset LatexCommand \ref{OMF file}
+
+\end_inset 
+
+) as input file.
+\layout Standard
+
+Last not least:
+\layout Itemize
+
+if you are not familiar with any of the following terms you're likely to
+ run into problems rather sooner than later: 
+\emph on 
+volatile
+\emph default 
+, 
+\emph on 
+atomic
+\emph default 
+, 
+\emph on 
+memory map
+\emph default 
+, 
+\emph on 
+overlay
+\emph default 
+.
+ As an embedded programmer you 
+\emph on 
+have
+\emph default 
+ to know them so why not look them up 
+\emph on 
+before
+\emph default 
+ you have problems?)
+\layout Itemize
+
+tell someone else about your problem (actually this is a surprisingly effective
+ means to hunt down the bug even if the listener is not familiar with your
+ environment).
+ As 'failure to communicate' is probably one of the job-induced deformations
+ of an embedded programmer this is highly encouraged.
+\layout Section
+
+Debugging with SDCDB
+\begin_inset LatexCommand \label{cha:Debugging-with-SDCDB}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{SDCDB (debugger)}
+
+\end_inset 
+
+\layout Standard
+
+SDCC is distributed with a source level debugger
+\begin_inset LatexCommand \index{Debugger}
+
+\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}
+
+\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.
+\layout Subsection
+
+Compiling for Debugging
+\layout Standard
+
+The -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-debug
+\begin_inset LatexCommand \index{-\/-debug}
+
+\end_inset 
+
+ option must be specified for all files for which debug information is to
+ be generated.
+ The compiler generates a .adb file for each of these files.
+ The linker creates the .cdb
+\begin_inset LatexCommand \index{<file>.cdb}
+
+\end_inset 
+
+ file from the .adb
+\begin_inset LatexCommand \index{<file>.adb}
+
+\end_inset 
+
+ 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
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-debug option is specified the compiler generates extra symbol information
+ some of which are put into the assembler source and some are put into the
+ .adb file.
+ Then the linker creates the .cdb file from the individual .adb files with
+ the address information for the symbols.
+ The debugger reads the symbolic information generated by the compiler &
+ the address information generated by the linker.
+ It uses the SIMULATOR (Daniel's S51) to execute the program, the program
+ execution is controlled by the debugger.
+ When a command is issued for the debugger, it translates it into appropriate
+ commands for the simulator.
+ (Currently SDCDM only connects to the simulator but 
+\emph on 
+newcdb
+\emph default 
+ at 
+\begin_inset LatexCommand \url{http://ec2drv.sf.net/}
+
+\end_inset 
+
+ is an effort to connect directly to the hardware.) 
+\layout Subsection
+
+Starting the Debugger SDCDB
+\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 
+sdcdb foo
+\newline 
+
+\family default 
+\series default 
+
+\newline 
+The debugger will look for the following files.
+\layout Itemize
+
+foo.c - the source file.
+\layout Itemize
+
+foo.cdb - the debugger symbol information file.
+\layout Itemize
+
+foo.ihx - the Intel hex format
+\begin_inset LatexCommand \index{Intel hex format}
+
+\end_inset 
+
+ object file.
+\layout Subsection
+
+SDCDB Command Line Options
+\layout Itemize
+
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\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
+
+\backslash 
+/
+\end_inset 
+
+-directory option should be -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-directory=/home/src1:/home/src2.
+ Note there can be no spaces in the option.
+\layout Itemize
+
+-cd <directory> - change to the <directory>.
+\layout Itemize
+
+-fullname - used by GUI front ends.
+\layout Itemize
+
+-cpu <cpu-type> - this argument is passed to the simulator please see the
+ simulator docs for details.
+\layout Itemize
+
+-X <Clock frequency > this options is passed to the simulator please see
+ the simulator docs for details.
+\layout Itemize
+
+-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 Itemize
+
+-k <port number> passed to simulator see the simulator docs for details.
+\layout Subsection
+
+SDCDB 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 this
+ section.
+\layout Subsubsection*
+
+break [line | file:line | function | file:function]
+\layout Standard
+
+Set breakpoint at specified line or function:
+\newline 
+
+\newline 
+
+\family sans 
+\series bold 
+sdcdb>break 100 
+\newline 
+sdcdb>break foo.c:100
+\newline 
+sdcdb>break funcfoo
+\newline 
+sdcdb>break foo.c:funcfoo
+\layout Subsubsection*
+
+clear [line | file:line | function | file:function ]
+\layout Standard
+
+Clear breakpoint at specified line or function:
+\newline 
+
+\newline 
+
+\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*
+
+continue
+\layout Standard
+
+Continue program being debugged, after breakpoint.
+\layout Subsubsection*
+
+finish
+\layout Standard
+
+Execute till the end of the current function.
+\layout Subsubsection*
+
+delete [n]
+\layout Standard
+
+Delete breakpoint number 'n'.
+ If used without any option clear ALL user defined break points.
+\layout Subsubsection*
+
+info [break | stack | frame | registers ]
+\layout Itemize
+
+info break - list all breakpoints
+\layout Itemize
+
+info stack - show the function call stack.
+\layout Itemize
+
+info frame - show information about the current execution frame.
+\layout Itemize
+
+info registers - show content of all registers.
+\layout Subsubsection*
+
+step
+\layout Standard
+
+Step program until it reaches a different source line.
+ Note: pressing <return> repeats the last command.
+\layout Subsubsection*
+
+next
+\layout Standard
+
+Step program, proceeding through subroutine calls.
+\layout Subsubsection*
+
+run
+\layout Standard
+
+Start debugged program.
+\layout Subsubsection*
+
+ptype variable 
+\layout Standard
+
+Print type information of the variable.
+\layout Subsubsection*
+
+print variable
+\layout Standard
+
+print value of variable.
+\layout Subsubsection*
+
+file filename
+\layout Standard
+
+load the given file name.
+ Note this is an alternate method of loading file for debugging.
+\layout Subsubsection*
+
+frame
+\layout Standard
+
+print information about current frame.
+\layout Subsubsection*
+
+set srcmode
+\layout Standard
+
+Toggle between C source & assembly source.
+\layout Subsubsection*
+
+! simulator command
+\layout Standard
+
+Send the string following '!' to the simulator, the simulator response is
+ displayed.
+ Note the debugger does not interpret the command being sent to the simulator,
+ so if a command like 'go' is sent the debugger can loose its execution
+ context and may display incorrect values.
+\layout Subsubsection*
+
+quit
+\layout Standard
+
+"Watch me now.
+ Iam going Down.
+ My name is Bobby Brown"
+\layout Subsection
+
+Interfacing SDCDB with DDD
+\layout Standard
+
+
+\begin_inset Note
+collapsed true
+
+\layout Standard
+
+The screenshot was converted from png to eps with: 
+\begin_inset Quotes sld
+\end_inset 
+
+bmeps -c -e8f -p3 ddd_example.png >ddd_example.eps
+\begin_inset Quotes srd
+\end_inset 
+
+ which produces a pretty compact eps file which is free from compression
+ artifacts.
+\layout Standard
+
+The screenshot was included in sdccman.lyx cvs version 1.120 but later removed
+ as this broke the build system on Sourceforge (pdf-file was broken.
+ pdflatex does not accept eps files).
+\end_inset 
+
+
+\layout Standard
+
+The 
+\emph on 
+p
+\emph default 
+ortable 
+\emph on 
+n
+\emph default 
+etwork 
+\emph on 
+g
+\emph default 
+raphics File 
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png}
+
+\end_inset 
+
+
+\size default 
+ shows a screenshot of a debugging session with DDD
+\begin_inset LatexCommand \index{DDD (debugger)}
+
+\end_inset 
+
+ (Unix only) on a simulated 8032.
+ The debugging session might not run as smoothly as the screenshot suggests.
+ The debugger allows setting of breakpoints, displaying and changing variables,
+ single stepping through C and assembler code.
+\newline 
+The source was compiled with 
+\family sans 
+\series bold 
+
+\newline 
+
+\newline 
+sdcc -
+\family default 
+\series default 
+
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+
+\family sans 
+\series bold 
+-debug ddd_example.c
+\family default 
+\series default 
+\family sans 
+\series bold 
+
+\newline 
+
+\family default 
+\series default 
+
+\newline 
+and DDD was invoked with 
+\family sans 
+\series bold 
+
+\newline 
+
+\newline 
+ddd -debugger "sdcdb -cpu 8032 ddd_example"
+\layout Standard
+
+
+\begin_inset Note
+collapsed false
+
+\layout Standard
+
+Check that the double quotes or an apostroph within the command line survive
+ the LyX tool chain.
+ Previously the apostrophs got slanted in the PDF output so a cut and paste
+ did not work.
+\end_inset 
+
+
+\layout Subsection
+
+Interfacing SDCDB with XEmacs
+\begin_inset LatexCommand \index{XEmacs}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \index{Emacs}
+
+\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 
+
+\newline 
+
+\family typewriter 
+(load-file sdcdbsrc.el) 
+\family default 
+
+\newline 
+
+\newline 
+.xemacs is a lisp file so the () around the command is REQUIRED.
+ The files can also be loaded dynamically while XEmacs is running, set the
+ environment variable 'EMACSLOADPATH' to the installation bin directory
+ (<installdir>/bin), then enter the following command ESC-x load-file sdcdbsrc.
+ To start the interface enter the following command: 
+\newline 
+
+\newline 
+
+\family sans 
+\series bold 
+ESC-x sdcdbsrc
+\family default 
+\series default 
+
+\newline 
+
+\newline 
+You will prompted to enter the file name to be debugged.
+\newline 
+
+\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
+
+sdcdbsrc-frequency '11059200
+\layout Itemize
+
+sdcdbsrc-serial nil
+\layout Standard
+
+The following is a list of key mapping for the debugger interface.
+\layout Standard
+\pagebreak_bottom 
+\SpecialChar ~
+
+\family typewriter 
+
+\newline 
+;;\SpecialChar ~
+Current Listing :: 
+\newline 
+;;key\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+binding\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+Comment 
+\newline 
+;;---\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+-------\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -23365,7 +25628,7 @@ Toggle list mode
 \newline 
 
 \layout Chapter
-\pagebreak_top 
+
 TIPS
 \layout Standard
 
@@ -23511,70 +25774,6 @@ Declare the variables to be local
  whenever possible, especially loop control variables (induction).
 \layout Itemize
 
-Since the compiler does not always do implicit integral promotion, the programme
-r should do an explicit cast when integral promotion is required.
-\layout Itemize
-
-Reducing the size of division, multiplication & modulus operations can reduce
- code size substantially.
- Take the following code for example.
-\begin_deeper 
-\layout Verse
-
-
-\family typewriter 
-foobar(unsigned int p1, unsigned char ch)
-\newline 
-{
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-unsigned char ch1 = p1 % ch ;
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-....
-\newline 
-}
-\layout Standard
-
-For the modulus operation the variable ch will be promoted to unsigned int
- first then the modulus operation will be performed (this will lead to a
- call to support routine _moduint()), and the result will be casted to a
- char.
- If the code is changed to 
-\layout Verse
-
-
-\family typewriter 
-foobar(unsigned int p1, unsigned char ch)
-\newline 
-{
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-unsigned char ch1 = (unsigned char)p1 % ch ;
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-....
-\newline 
-}
-\layout Standard
-
-It would substantially reduce the code generated (future versions of the
- compiler will be smart enough to detect such optimization opportunities).
-\end_deeper 
-\layout Itemize
-
 Have a look at the assembly listing to get a 
 \begin_inset Quotes sld
 \end_inset 
@@ -23792,6 +25991,8 @@ Tools
 
 \layout Standard
 
+
+\series bold 
 Name
 \end_inset 
 </cell>
@@ -23800,6 +26001,8 @@ Name
 
 \layout Standard
 
+
+\series bold 
 Purpose
 \end_inset 
 </cell>
@@ -23808,6 +26011,8 @@ Purpose
 
 \layout Standard
 
+
+\series bold 
 Directory
 \end_inset 
 </cell>
@@ -23818,7 +26023,12 @@ Directory
 
 \layout Standard
 
-ucSsim
+uCsim
+\begin_inset LatexCommand \index{uCsim}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24206,14 +26416,16 @@ Documentation
 \begin_inset  Tabular
 <lyxtabular version="3" rows="10" columns="2">
 <features>
-<column alignment="left" valignment="top" leftline="true" width="0">
-<column alignment="left" valignment="top" leftline="true" rightline="true" width="0pt">
-<row topline="true" bottomline="true">
+<column alignment="block" valignment="top" leftline="true" width="40col%">
+<column alignment="block" valignment="top" leftline="true" rightline="true" width="60col%">
+<row topline="true" bottomline="true" endhead="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+
+\series bold 
 Subject / Title
 \end_inset 
 </cell>
@@ -24222,7 +26434,9 @@ Subject / Title
 
 \layout Standard
 
-Where to get / filename
+
+\series bold 
+Filename / Where to get
 \end_inset 
 </cell>
 </row>
@@ -24241,6 +26455,22 @@ SDCC Compiler User Guide
 \layout Standard
 
 You're reading it right now
+\emph on 
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/sdccman.pdf}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24259,6 +26489,22 @@ Changelog of SDCC
 \layout Standard
 
 sdcc/Changelog
+\emph on 
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/ChangeLog}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24278,7 +26524,9 @@ ASXXXX
 
 \end_inset 
 
- Assemblers and ASLINK
+ Assemblers and
+\newline 
+ASLINK
 \begin_inset LatexCommand \index{aslink}
 
 \end_inset 
@@ -24290,13 +26538,29 @@ ASXXXX
 
  Relocating Linker
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+sdcc/as/doc/asxhtm.html 
+\emph on 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/as/doc/asxhtm.html}
+
+\end_inset 
 
-\layout Standard
 
-sdcc/as/doc/asxhtm.html
 \end_inset 
 </cell>
 </row>
@@ -24319,7 +26583,23 @@ SDCC regression test
 
 \layout Standard
 
-sdcc/doc/test_suite_spec.pdf
+sdcc/doc/test_suite_spec.pdf 
+\emph on 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24337,7 +26617,23 @@ Various notes
 
 \layout Standard
 
-sdcc/doc/*
+sdcc/doc/* 
+\emph on 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/doc/}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24360,7 +26656,23 @@ Notes on debugging with SDCDB
 
 \layout Standard
 
-sdcc/debugger/README
+sdcc/debugger/README 
+\emph on 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at
+\emph default 
+:
+\newline 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/debugger/README}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24370,7 +26682,12 @@ sdcc/debugger/README
 
 \layout Standard
 
-Software simulator for microcontrollers
+uCsim
+\begin_inset LatexCommand \index{uCsim}
+
+\end_inset 
+
+ Software simulator for microcontrollers
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24395,8 +26712,23 @@ sdcc/sim/ucsim/doc
 \emph default 
 \bar default 
 \noun default 
-\color default
-/index.html
+/index.html 
+\emph on 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/sim/ucsim/doc/index.html}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24419,7 +26751,23 @@ Temporary notes on the pic16
 
 \layout Standard
 
-sdcc/src/pic16/NOTES
+sdcc/src/pic16/NOTES 
+\emph on 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\newline 
+
+\emph default 
+
+\begin_inset LatexCommand \url{http://svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/src/pic16/NOTES}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24454,8 +26802,23 @@ cdbfileformat.pd
 \emph default 
 \bar default 
 \noun default 
-\color default
 f
+\emph on 
+ \SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+
+\hfill 
+online at:
+\emph default 
+
+\newline 
+
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/cdbfileformat.pdf}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24492,9 +26855,181 @@ Related open source tools
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
-\layout Standard
+\layout Standard
+
+
+\series bold 
+Name
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
+Purpose
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
+Where to get
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+gpsim
+\begin_inset LatexCommand \index{gpsim (pic simulator)}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+PIC simulator
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\begin_inset LatexCommand \url{http://www.dattalo.com/gnupic/gpsim.html}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+gputils
+\begin_inset LatexCommand \index{gputils (pic tools)}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+GNU PIC utilities
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+flP5
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+PIC programmer
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\begin_inset LatexCommand \url{http://freshmeat.net/projects/flp5/}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+ec2drv/newcdb
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB
+ (Unix only)
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\begin_inset LatexCommand \url{http://sourceforge.net/projects/ec2drv}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+indent
+\begin_inset LatexCommand \index{indent (source formatting tool)}
+
+\end_inset 
+
 
-Name
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24502,7 +27037,7 @@ Name
 
 \layout Standard
 
-Purpose
+Formats C source - Master of the white spaces
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24510,7 +27045,12 @@ Purpose
 
 \layout Standard
 
-Where to get
+
+\begin_inset LatexCommand \url{http://directory.fsf.org/GNU/indent.html}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -24520,8 +27060,8 @@ Where to get
 
 \layout Standard
 
-gpsim
-\begin_inset LatexCommand \index{gpsim (pic simulator)}
+srecord
+\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)}
 
 \end_inset 
 
@@ -24533,7 +27073,7 @@ gpsim
 
 \layout Standard
 
-PIC simulator
+Object file conversion, checksumming, ...
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24542,7 +27082,7 @@ PIC simulator
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://www.dattalo.com/gnupic/gpsim.html}
+\begin_inset LatexCommand \url{http://sourceforge.net/projects/srecord}
 
 \end_inset 
 
@@ -24556,8 +27096,8 @@ PIC simulator
 
 \layout Standard
 
-gputils
-\begin_inset LatexCommand \index{gputils (pic tools)}
+objdump
+\begin_inset LatexCommand \index{objdump (tool)}
 
 \end_inset 
 
@@ -24569,7 +27109,33 @@ gputils
 
 \layout Standard
 
-GNU PIC utilities
+Object file conversion, ...
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+Part of binutils (should be there anyway)
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+cmon51
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+8051 monitor (hex up-/download, single step, disassemble)
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24578,7 +27144,7 @@ GNU PIC utilities
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/gputils}
+\begin_inset LatexCommand \url{http://sourceforge.net/projects/cmon51}
 
 \end_inset 
 
@@ -24592,7 +27158,12 @@ GNU PIC utilities
 
 \layout Standard
 
-flP5
+doxygen
+\begin_inset LatexCommand \index{doxygen (source documentation tool)}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24600,7 +27171,7 @@ flP5
 
 \layout Standard
 
-PIC programmer
+Source code documentation system
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24609,7 +27180,7 @@ PIC programmer
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://freshmeat.net/projects/flp5/}
+\begin_inset LatexCommand \url{http://www.doxygen.org}
 
 \end_inset 
 
@@ -24623,7 +27194,7 @@ PIC programmer
 
 \layout Standard
 
-ec2drv/newcdb
+kdevelop
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24631,8 +27202,7 @@ ec2drv/newcdb
 
 \layout Standard
 
-Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB
- (Unix only)
+IDE (has anyone tried integrating SDCC & SDCDB? Unix only)
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24641,7 +27211,7 @@ Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/ec2drv}
+\begin_inset LatexCommand \url{http://www.kdevelop.org}
 
 \end_inset 
 
@@ -24655,12 +27225,7 @@ Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB
 
 \layout Standard
 
-indent
-\begin_inset LatexCommand \index{indent (source formatting tool)}
-
-\end_inset 
-
-
+paulmon
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24668,7 +27233,7 @@ indent
 
 \layout Standard
 
-Formats C source - Master of the white spaces
+8051 monitor (hex up-/download, single step, disassemble)
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24677,7 +27242,7 @@ Formats C source - Master of the white spaces
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://directory.fsf.org/GNU/indent.html}
+\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/paulmon2.html}
 
 \end_inset 
 
@@ -24691,8 +27256,8 @@ Formats C source - Master of the white spaces
 
 \layout Standard
 
-srecord
-\begin_inset LatexCommand \index{srecord (bin, hex, ... tool)}
+splint
+\begin_inset LatexCommand \index{splint (syntax checking tool)}
 
 \end_inset 
 
@@ -24704,7 +27269,12 @@ srecord
 
 \layout Standard
 
-Object file conversion, checksumming, ...
+Statically checks c sources (see 
+\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
+
+\end_inset 
+
+)
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24713,7 +27283,7 @@ Object file conversion, checksumming, ...
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/srecord}
+\begin_inset LatexCommand \url{http://www.splint.org}
 
 \end_inset 
 
@@ -24721,14 +27291,14 @@ Object file conversion, checksumming, ...
 \end_inset 
 </cell>
 </row>
-<row topline="true">
+<row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-objdump
-\begin_inset LatexCommand \index{objdump (tool)}
+ddd
+\begin_inset LatexCommand \index{DDD (debugger)}
 
 \end_inset 
 
@@ -24740,7 +27310,12 @@ objdump
 
 \layout Standard
 
-Object file conversion, ...
+Debugger, serves nicely as GUI to SDCDB
+\begin_inset LatexCommand \index{SDCDB (debugger)}
+
+\end_inset 
+
+ (Unix only)
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24748,17 +27323,43 @@ Object file conversion, ...
 
 \layout Standard
 
-Part of binutils (should be there anyway)
+
+\begin_inset LatexCommand \url{http://www.gnu.org/software/ddd/}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
-<row topline="true">
+</lyxtabular>
+
+\end_inset 
+
+
+\newline 
+
+\layout Section
+
+Related documentation / recommended reading
+\layout Standard
+\align left 
+
+\begin_inset  Tabular
+<lyxtabular version="3" rows="7" columns="3">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="0pt">
+<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="left" valignment="top" leftline="true" rightline="true" width="0pt">
+<row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-cmon51
+
+\series bold 
+Name
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24766,7 +27367,9 @@ cmon51
 
 \layout Standard
 
-8051 monitor (hex up-/download, single step, disassemble)
+
+\series bold 
+Subject / Title
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24775,11 +27378,8 @@ cmon51
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://sourceforge.net/projects/cmon51}
-
-\end_inset 
-
-
+\series bold 
+Where to get
 \end_inset 
 </cell>
 </row>
@@ -24789,12 +27389,16 @@ cmon51
 
 \layout Standard
 
-doxygen
-\begin_inset LatexCommand \index{doxygen (source documentation tool)}
-
-\end_inset 
-
 
+\family roman 
+\series medium 
+\shape up 
+\size normal 
+\emph off 
+\bar no 
+\noun off 
+\color none
+c-refcard.pdf
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24802,7 +27406,12 @@ doxygen
 
 \layout Standard
 
-Source code documentation system
+C Reference Card
+\begin_inset LatexCommand \index{C Reference card}
+
+\end_inset 
+
+, 2 pages
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24811,7 +27420,7 @@ Source code documentation system
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://www.doxygen.org}
+\begin_inset LatexCommand \url{http://refcards.com/refcards/c/index.html}
 
 \end_inset 
 
@@ -24825,7 +27434,7 @@ Source code documentation system
 
 \layout Standard
 
-kdevelop
+c-faq
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24833,7 +27442,12 @@ kdevelop
 
 \layout Standard
 
-IDE (has anyone tried integrating SDCC & SDCDB? Unix only)
+C-FAQ
+\begin_inset LatexCommand \index{C FAQ}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24842,7 +27456,7 @@ IDE (has anyone tried integrating SDCC & SDCDB? Unix only)
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://www.kdevelop.org}
+\begin_inset LatexCommand \url{http://www.c-faq.com}
 
 \end_inset 
 
@@ -24856,7 +27470,7 @@ IDE (has anyone tried integrating SDCC & SDCDB? Unix only)
 
 \layout Standard
 
-paulmon
+ISO/IEC 9899:TC2
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24864,7 +27478,15 @@ paulmon
 
 \layout Standard
 
-8051 monitor (hex up-/download, single step, disassemble)
+
+\begin_inset Quotes sld
+\end_inset 
+
+C-Standard
+\begin_inset Quotes srd
+\end_inset 
+
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24873,7 +27495,9 @@ paulmon
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/paulmon2.html}
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899}
 
 \end_inset 
 
@@ -24887,12 +27511,7 @@ paulmon
 
 \layout Standard
 
-splint
-\begin_inset LatexCommand \index{splint (syntax checking tool)}
-
-\end_inset 
-
-
+ISO/IEC DTR 18037
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24900,12 +27519,15 @@ splint
 
 \layout Standard
 
-Statically checks c sources (see 
-\begin_inset LatexCommand \ref{lyx:more-pedantic-SPLINT}
 
+\begin_inset Quotes sld
 \end_inset 
 
-)
+Extensions for Embedded C
+\begin_inset Quotes srd
+\end_inset 
+
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -24914,7 +27536,9 @@ Statically checks c sources (see
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://www.splint.org}
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1021.pdf}
 
 \end_inset 
 
@@ -24922,18 +27546,12 @@ Statically checks c sources (see
 \end_inset 
 </cell>
 </row>
-<row topline="true" bottomline="true">
+<row topline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-ddd
-\begin_inset LatexCommand \index{DDD (debugger)}
-
-\end_inset 
-
-
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -24941,25 +27559,40 @@ ddd
 
 \layout Standard
 
-Debugger, serves nicely as GUI to SDCDB
-\begin_inset LatexCommand \index{SDCDB (debugger)}
-
+Latest datasheet of target CPU
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- (Unix only)
+\layout Standard
+
+vendor
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\begin_inset LatexCommand \url{http://www.gnu.org/software/ddd/}
+\layout Standard
 
+Revision history of datasheet
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
+vendor
 \end_inset 
 </cell>
 </row>
@@ -24972,30 +27605,47 @@ Debugger, serves nicely as GUI to SDCDB
 
 \layout Section
 
-Related documentation / recommended reading
+Application notes specifically for SDCC
+\layout Standard
+
+SDCC makes no claims about the completeness of this list and about up-to-datenes
+s or correctness of the application notes
+\begin_inset LatexCommand \index{Application notes}
+
+\end_inset 
+
+.
 \layout Standard
 \align left 
 
+\size footnotesize 
+
 \begin_inset  Tabular
 <lyxtabular version="3" rows="7" columns="3">
 <features>
-<column alignment="left" valignment="top" leftline="true" width="0pt">
-<column alignment="center" valignment="top" leftline="true" width="0">
-<column alignment="left" valignment="top" leftline="true" rightline="true" width="0pt">
+<column alignment="block" valignment="top" leftline="true" width="17col%">
+<column alignment="block" valignment="top" leftline="true" width="27col%">
+<column alignment="block" valignment="top" leftline="true" rightline="true" width="57col%">
 <row topline="true" bottomline="true">
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
-Name
+
+\series bold 
+\size footnotesize 
+Vendor
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
 \begin_inset Text
 
 \layout Standard
 
+
+\series bold 
+\size footnotesize 
 Subject / Title
 \end_inset 
 </cell>
@@ -25004,6 +27654,9 @@ Subject / Title
 
 \layout Standard
 
+
+\series bold 
+\size footnotesize 
 Where to get
 \end_inset 
 </cell>
@@ -25015,15 +27668,8 @@ Where to get
 \layout Standard
 
 
-\family roman 
-\series medium 
-\shape up 
-\size normal 
-\emph off 
-\bar no 
-\noun off 
-\color none
-c-refcard.pdf
+\size footnotesize 
+Maxim / Dallas
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -25031,12 +27677,14 @@ c-refcard.pdf
 
 \layout Standard
 
-C Reference Card
-\begin_inset LatexCommand \index{C Reference card}
+
+\size footnotesize 
+Using the SDCC Compiler for the DS80C400
+\begin_inset LatexCommand \index{DS80C400}
 
 \end_inset 
 
-, 2 pages
+
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -25045,7 +27693,9 @@ C Reference Card
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://refcards.com/refcards/c/index.html}
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3346.pdf}
 
 \end_inset 
 
@@ -25059,20 +27709,24 @@ C Reference Card
 
 \layout Standard
 
-c-faq
+
+\size footnotesize 
+Maxim / Dallas
 \end_inset 
 </cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+<cell multicolumn="1" alignment="left" valignment="top" topline="true" leftline="true" usebox="none" width="30line%">
 \begin_inset Text
 
 \layout Standard
 
-C-FAQ
-\begin_inset LatexCommand \index{C FAQ}
 
-\end_inset 
+\size footnotesize 
+Using the Free SDCC C Compiler to Develop Firmware for the DS89C420/430/440/450
+\begin_inset LatexCommand \index{DS89C4x0}
 
+\end_inset 
 
+ Family of Microcontrollers
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -25081,7 +27735,9 @@ C-FAQ
 \layout Standard
 
 
-\begin_inset LatexCommand \url{http://www.c-faq.com}
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3477.pdf}
 
 \end_inset 
 
@@ -25095,7 +27751,9 @@ C-FAQ
 
 \layout Standard
 
-ISO/IEC 9899:TC2
+
+\size footnotesize 
+Silicon Laboratories / Cygnal
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -25104,11 +27762,10 @@ ISO/IEC 9899:TC2
 \layout Standard
 
 
-\begin_inset Quotes sld
-\end_inset 
+\size footnotesize 
+Integrating SDCC 8051 Tools Into The Silicon Labs IDE
+\begin_inset LatexCommand \index{IDE}
 
-C-Standard
-\begin_inset Quotes srd
 \end_inset 
 
 
@@ -25122,7 +27779,7 @@ C-Standard
 
 \size footnotesize 
 
-\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899}
+\begin_inset LatexCommand \url{http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/en/an198.pdf}
 
 \end_inset 
 
@@ -25136,7 +27793,9 @@ C-Standard
 
 \layout Standard
 
-ISO/IEC DTR 18037
+
+\size footnotesize 
+Ramtron / Goal Semiconductor
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -25145,14 +27804,8 @@ ISO/IEC DTR 18037
 \layout Standard
 
 
-\begin_inset Quotes sld
-\end_inset 
-
-Extensions for Embedded C
-\begin_inset Quotes srd
-\end_inset 
-
-
+\size footnotesize 
+Interfacing SDCC to Syn and Textpad
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -25163,7 +27816,7 @@ Extensions for Embedded C
 
 \size footnotesize 
 
-\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1021.pdf}
+\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp}
 
 \end_inset 
 
@@ -25177,6 +27830,9 @@ Extensions for Embedded C
 
 \layout Standard
 
+
+\size footnotesize 
+Ramtron / Goal Semiconductor
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -25184,7 +27840,9 @@ Extensions for Embedded C
 
 \layout Standard
 
-Latest datasheet of target CPU
+
+\size footnotesize 
+Installing and Configuring SDCC and Crimson Editor 
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -25192,7 +27850,14 @@ Latest datasheet of target CPU
 
 \layout Standard
 
-vendor
+
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -25202,6 +27867,9 @@ vendor
 
 \layout Standard
 
+
+\size footnotesize 
+Texas Instruments
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
@@ -25209,7 +27877,9 @@ vendor
 
 \layout Standard
 
-Revision history of datasheet
+
+\size footnotesize 
+MSC12xx Programming with SDCC
 \end_inset 
 </cell>
 <cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
@@ -25217,7 +27887,14 @@ Revision history of datasheet
 
 \layout Standard
 
-vendor
+
+\size footnotesize 
+
+\begin_inset LatexCommand \url{http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sbaa109&fileType=pdf}
+
+\end_inset 
+
+
 \end_inset 
 </cell>
 </row>
@@ -25226,1575 +27903,2211 @@ vendor
 \end_inset 
 
 
-\newline 
-
 \layout Section
 
-Application notes specifically for SDCC
+Some Questions
 \layout Standard
 
-SDCC makes no claims about the completeness of this list and about up-to-datenes
-s or correctness of the application notes
-\begin_inset LatexCommand \index{Application notes}
+Some questions answered, some pointers given - it might be time to in turn
+ ask 
+\emph on 
+you
+\emph default 
+ some questions: 
+\layout Itemize
 
-\end_inset 
+can you solve your project with the selected microcontroller? Would you
+ find out early or rather late that your target is too small/slow/whatever?
+ Can you switch to a slightly better device if it doesn't fit?
+\layout Itemize
 
-.
-\layout Standard
-\align left 
+should you solve the problem with an 8 bit CPU? Or would a 16/32 bit CPU
+ and/or another programming language be more adequate? Would an operating
+ system on the target device help?
+\layout Itemize
 
-\size footnotesize 
+if you solved the problem, will the marketing department be happy?
+\layout Itemize
 
-\begin_inset  Tabular
-<lyxtabular version="3" rows="7" columns="3">
-<features>
-<column alignment="block" valignment="top" leftline="true" width="17col%">
-<column alignment="block" valignment="top" leftline="true" width="27col%">
-<column alignment="block" valignment="top" leftline="true" rightline="true" width="57col%">
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+if the marketing department is happy, will customers be happy?
+\layout Itemize
+
+if you're the project manager, marketing department and maybe even the customer
+ in one person, have you tried to see the project from the outside?
+\layout Itemize
+
+is the project done if you think it is done? Or is just that other interface/pro
+tocol/feature/configuration/option missing? How about website, manual(s),
+ internationali(z|s)ation, packaging, labels, 2nd source for components,
+ electromagnetic compatability/interference, documentation for production,
+ production test software, update mechanism, patent issues?
+\layout Itemize
 
+is your project adequately positioned in that magic triangle: fame, fortune,
+ fun?
 \layout Standard
 
+Maybe not all answers to these questions are known and some answers may
+ even be 
+\emph on 
+no
+\emph default 
+, nevertheless knowing these questions may help you to avoid burnout
+\begin_inset Foot
+collapsed false
+
+\layout Standard
 
-\size footnotesize 
-Vendor
+burnout is bad for electronic devices, programmers and motorcycle tyres
 \end_inset 
-</cell>
-<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+ Chances are you didn't want to hear some of them...
+\layout Chapter
 
+Support
+\begin_inset LatexCommand \index{Support}
 
-\size footnotesize 
-Subject / Title
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+
+\layout Standard
+
+SDCC has grown to be a large project.
+ The compiler alone (without the preprocessor, assembler and linker) is
+ well over 150,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
 
+The SDCC project is hosted on the SDCC sourceforge site at 
+\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc}
 
-\size footnotesize 
-Where to get
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+.
+ You'll find the complete set of mailing lists
+\begin_inset LatexCommand \index{Mailing list(s)}
+
+\end_inset 
+
+, forums, bug reporting system, patch submission
+\begin_inset LatexCommand \index{Patch submission}
 
+\end_inset 
+
+ system, download
+\begin_inset LatexCommand \index{download}
 
-\size footnotesize 
-Maxim / Dallas
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ area and Subversion code repository
+\begin_inset LatexCommand \index{Subversion code repository}
 
+\end_inset 
 
-\size footnotesize 
-Using the SDCC Compiler for the DS80C400
-\begin_inset LatexCommand \index{DS80C400}
+ there.
+\layout Section
+
+Reporting Bugs
+\begin_inset LatexCommand \index{Bug reporting}
 
 \end_inset 
 
 
+\begin_inset LatexCommand \index{Reporting bugs}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
 
 \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
 
-\size footnotesize 
+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
 
-\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3346.pdf}
+\layout Standard
 
+\backslash 
+/
 \end_inset 
 
+-dumpall
+\begin_inset LatexCommand \index{-\/-dumpall}
 
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ option can sometimes be useful in locating optimization problems.
+ When reporting a bug please make sure you:
+\layout Enumerate
 
+Attach the code you are compiling with SDCC.
+\layout Enumerate
 
-\size footnotesize 
-Maxim / Dallas
-\end_inset 
-</cell>
-<cell multicolumn="1" alignment="left" valignment="top" topline="true" leftline="true" usebox="none" width="30line%">
-\begin_inset Text
+Specify the exact command you use to run SDCC, or attach your Makefile.
+\layout Enumerate
+
+Specify the SDCC version (type "
+\family sans 
+\series bold 
+sdcc -v
+\family default 
+\series default 
+"), your platform, and operating system.
+\layout Enumerate
+
+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
 
-\size footnotesize 
-Using the Free SDCC C Compiler to Develop Firmware for the DS89C420/430/440/450
-\begin_inset LatexCommand \index{DS89C4x0}
+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 
 
- Family of Microcontrollers
+.
+ With SDCC on average having more than 200 downloads
+\begin_inset LatexCommand \index{download}
+
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
+
+ on sourceforge per day
+\begin_inset Foot
+collapsed false
 
 \layout Standard
 
+220 daily downloads on average Jan-Sept 2006 and about 150 daily downloads
+ between 2002 and 2005.
+ This does not include other methods of distribution.
+\end_inset 
 
-\size footnotesize 
+ there must be some users.
+ So it's not exactly easy to find a new bug.
+ If you find one we need it: 
+\emph on 
+reporting bugs is good
+\emph default 
+.
+\layout Section
 
-\begin_inset LatexCommand \url{http://pdfserv.maxim-ic.com/en/an/AN3477.pdf}
+Requesting Features
+\begin_inset LatexCommand \label{sub:Requesting-Features}
 
 \end_inset 
 
 
+\begin_inset LatexCommand \index{Feature request}
+
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset LatexCommand \index{Requesting features}
 
-\size footnotesize 
-Silicon Laboratories / Cygnal
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+
 
 \layout Standard
 
+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}
 
-\size footnotesize 
-Integrating SDCC 8051 Tools Into The Silicon Labs IDE
-\begin_inset LatexCommand \index{IDE}
+\end_inset 
+
+.
+\layout Section
+
+Submitting patches
+\layout Standard
+
+Like bug reports contributed patches are forwarded to the developer mailing
+ list.
+ This is the link for submitting patches
+\begin_inset LatexCommand \index{Patch submission}
 
 \end_inset 
 
+: 
+\begin_inset LatexCommand \url{http://sourceforge.net/tracker/?group_id=599&atid=300599}
 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
+.
 \layout Standard
 
+You need to specify some parameters to the 
+\family typewriter 
+diff
+\family default 
+ command for the patches to be useful.
+ If you modified more than one file a patch created f.e.
+ with 
+\family sans 
+\series bold 
 
-\size footnotesize 
-
-\begin_inset LatexCommand \url{http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/en/an198.pdf}
+\begin_inset Quotes sld
+\end_inset 
 
+diff -Naur unmodified_directory modified_directory >my_changes.patch
+\begin_inset Quotes srd
 \end_inset 
 
 
+\family default 
+\series default 
+ will be fine, otherwise 
+\family sans 
+\series bold 
+
+\begin_inset Quotes sld
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+diff -u sourcefile.c.orig sourcefile.c >my_changes.patch
+\begin_inset Quotes srd
+\end_inset 
 
 
-\size footnotesize 
-Ramtron / Goal Semiconductor
-\end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
+\series default 
+\family default 
+will do.
+\layout Section
 
+Getting Help
 \layout Standard
 
+These links should take you directly to the 
+\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599}
 
-\size footnotesize 
-Interfacing SDCC to Syn and Textpad
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
 
+\begin_inset Foot
+collapsed false
+
+\layout Standard
 
-\size footnotesize 
+Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting
+ automated messages (mid 2003)
+\end_inset 
 
-\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp}
+ and the 
+\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599}
 
 \end_inset 
 
+, lists
+\begin_inset LatexCommand \index{Mailing list(s)}
 
 \end_inset 
-</cell>
-</row>
-<row topline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
+ and forums are archived and searchable so if you are lucky someone already
+ had a similar problem.
+ While mails to the lists themselves are delivered promptly their web front
+ end on sourceforge sometimes shows a severe time lag (up to several weeks),
+ if you're seriously using SDCC please consider subscribing to the lists.
+\layout Section
+
+ChangeLog
 \layout Standard
 
+You can follow the status of the Subversion version
+\begin_inset LatexCommand \index{version}
 
-\size footnotesize 
-Ramtron / Goal Semiconductor
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ of SDCC by watching the Changelog
+\begin_inset LatexCommand \index{Changelog}
+
+\end_inset 
 
+ in the Subversion repository
+\size footnotesize 
+\begin_inset LatexCommand \htmlurl{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/ChangeLog}
 
-\size footnotesize 
-Installing and Configuring SDCC and Crimson Editor 
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+.
+\layout Section
 
-\size footnotesize 
+Subversion Source Code Repository
+\layout Standard
 
-\begin_inset LatexCommand \url{http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp}
+The output of 
+\family sans 
+\series bold 
+sdcc --version
+\family default 
+\series default 
+ or the filenames of the snapshot versions of SDCC include date and its
+ Subversion
+\begin_inset LatexCommand \index{Subversion code repository}
 
 \end_inset 
 
+ number.
+ Subversion allows to download the source of recent or previous versions
+\begin_inset LatexCommand \url{http://sourceforge.net/svn/?group_id=599}
 
 \end_inset 
-</cell>
-</row>
-<row topline="true" bottomline="true">
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
+ (by number or by date).
+ An on-line source code browser and detailled instructions are also available
+ there.
+ SDCC versions starting from 1999 up to now are available (currently the
+ versions prior to the conversion from cvs
+\begin_inset LatexCommand \index{cvs|see{Subversion}}
 
-\size footnotesize 
-Texas Instruments
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
-\begin_inset Text
 
-\layout Standard
+ to Subversion (April 2006) are either by accessible by Subversion or by
+ cvs).
+\layout Section
 
+Release policy
+\begin_inset LatexCommand \index{Release policy}
 
-\size footnotesize 
-MSC12xx Programming with SDCC
 \end_inset 
-</cell>
-<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
-\begin_inset Text
-
-\layout Standard
 
 
-\size footnotesize 
+\layout Standard
 
-\begin_inset LatexCommand \url{http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sbaa109&fileType=pdf}
+Historically there often were long delays between official releases and
+ the sourceforge download area tends to get not updated at all.
+ Excuses in the past might have referred to problems with live range analysis,
+ but as this was fixed a while ago, the current problem is that another
+ excuse has to be found.
+ Kidding aside, we have to get better there! On the other hand there are
+ daily snapshots available at 
+\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php}
 
 \end_inset 
 
+, and you can always build the very last version (hopefully with many bugs
+ fixed, and features added) from the source code available at 
+\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source}
 
 \end_inset 
-</cell>
-</row>
-</lyxtabular>
 
-\end_inset 
+.
+ A release wiki
+\begin_inset LatexCommand \index{wiki}
 
+\end_inset 
 
-\layout Section
 
-Some Questions
-\layout Standard
+\begin_inset LatexCommand \index{Release wiki}
 
-Some questions answered, some pointers given - it might be time to in turn
- ask 
-\emph on 
-you
-\emph default 
- some questions: 
-\layout Itemize
+\end_inset 
 
-can you solve your project with the selected microcontroller? Would you
- find out early or rather late that your target is too small/slow/whatever?
- Can you switch to a slightly better device if it doesn't fit?
-\layout Itemize
+ at 
+\begin_inset LatexCommand \url{http://sdcc.sf.net/release_wiki/}
 
-should you solve the problem with an 8 bit CPU? Or would a 16/32 bit CPU
- and/or another programming language be more adequate? Would an operating
- system on the target device help?
-\layout Itemize
+\end_inset 
 
-if you solved the problem, will the marketing department be happy?
-\layout Itemize
+ also holds some information about past and future releases.
+\layout Section
 
-if the marketing department is happy, will customers be happy?
-\layout Itemize
+Examples
+\begin_inset LatexCommand \index{Examples}
 
-if you're the project manager, marketing department and maybe even the customer
- in one person, have you tried to see the project from the outside?
-\layout Itemize
+\end_inset 
 
-is the project done if you think it is done? Or is just that other interface/pro
-tocol/feature/configuration/option missing? How about website, manual(s),
- internationali(z|s)ation, packaging, labels, 2nd source for components,
- electromagnetic compatability/interference, documentation for production,
- production test software, update mechanism, patent issues?
-\layout Itemize
 
-is your project adequately positioned in that magic triangle: fame, fortune,
- fun?
 \layout Standard
 
-Maybe not all answers to these questions are known and some answers may
- even be 
+You'll find some small examples in the directory 
 \emph on 
-no
+sdcc/device/examples/.
 \emph default 
-, nevertheless knowing these questions may help you to avoid burnout
-\begin_inset Foot
-collapsed false
+More examples and libraries are available at
+\emph on 
+ The SDCC Open Knowledge Resource 
+\begin_inset LatexCommand \url{http://sdccokr.dl9sec.de/}
 
-\layout Standard
+\end_inset 
+
+\emph default 
+web site or at 
+\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/}
 
-burnout is bad for electronic devices, programmers and motorcycle tyres
 \end_inset 
 
 .
- Chances are you didn't want to hear some of them...
-\layout Chapter
-
-Support
-\begin_inset LatexCommand \index{Support}
+\layout Standard
 
-\end_inset 
 
+\begin_inset Note
+collapsed true
 
 \layout Standard
 
-SDCC has grown to be a large project.
- The compiler alone (without the preprocessor, assembler and linker) is
- well over 150,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.
+I did insert a reference to Paul's web site here although it seems rather
+ dedicated to a specific 8032 board (I think it's okay because it f.e.
+ shows LCD/Harddisc interface and has a free 8051 monitor.
+ Independent 8032 board vendors face hard competition of heavily subsidized
+ development boards anyway).
 \layout Standard
 
-The SDCC project is hosted on the SDCC sourceforge site at 
-\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc}
-
+Maybe we should include some links to real world applications.
+ Preferably pointer to pointers (one for each architecture) so this stays
+ manageable here?
 \end_inset 
 
-.
- You'll find the complete set of mailing lists
-\begin_inset LatexCommand \index{Mailing list(s)}
 
-\end_inset 
+\layout Section
 
-, forums, bug reporting system, patch submission
-\begin_inset LatexCommand \index{Patch submission}
+Quality control
+\begin_inset LatexCommand \label{sec:Quality-control}
 
 \end_inset 
 
- system, download
-\begin_inset LatexCommand \index{download}
+
+\begin_inset LatexCommand \index{Quality control}
 
 \end_inset 
 
- area and Subversion code repository
-\begin_inset LatexCommand \index{Subversion code repository}
 
-\end_inset 
+\layout Standard
 
- there.
-\layout Section
+The compiler is passed through nightly compile and build checks.
+ The so called 
+\shape italic 
+regression tests
+\shape default 
 
-Reporting Bugs
-\begin_inset LatexCommand \index{Bug reporting}
+\begin_inset LatexCommand \index{Regression test}
 
 \end_inset 
 
-
-\begin_inset LatexCommand \index{Reporting bugs}
+ check that SDCC itself compiles flawlessly on several host platforms (i386,
+ Opteron, 64 bit Alpha, ppc64, MacOS X on PPC, Solaris on Sparc) and checks
+ the quality of the code generated by SDCC by running the code for several
+ target platforms through simulators.
+ The regression test suite comprises more than 100 files which expand to
+ more than 500 test cases which include more than 4500 tests.
+ The results of these tests are published daily on SDCC's snapshot page
+ (click on the red or green symbols on the right side of 
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
 
 \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
+There is a separate document 
+\shape italic 
+test_suite.pdf 
+\begin_inset LatexCommand \index{Test suite}
 
-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
+\end_inset 
 
-\layout Standard
 
-\backslash 
-/
+\shape default 
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf}
+
 \end_inset 
 
--dumpall
-\begin_inset LatexCommand \index{-\/-dumpall}
+ about the regression test suite.
+\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 
+\series bold 
 
+\begin_inset Quotes sld
 \end_inset 
 
- option can sometimes be useful in locating optimization problems.
- When reporting a bug please make sure you:
-\layout Enumerate
-
-Attach the code you are compiling with SDCC.
-\layout Enumerate
+make test-mcs51
+\begin_inset Quotes srd
+\end_inset 
 
-Specify the exact command you use to run SDCC, or attach your Makefile.
-\layout Enumerate
 
-Specify the SDCC version (type "
-\family sans 
-\series bold 
-sdcc -v
 \family default 
 \series default 
-"), your platform, and operating system.
-\layout Enumerate
+ 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}
 
-Provide an exact copy of any error message or incorrect output.
-\layout Enumerate
+\end_inset 
 
-Put something meaningful in the subject of your message.
-\layout Standard
+ checking corner cases of SDCC or if you plan to submit patches
+\begin_inset LatexCommand \index{Patch submission}
 
-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! 
+\end_inset 
+
+.
 \layout Standard
 
-Please have a short check that you are using a recent version of SDCC and
- the bug is not yet known.
- This is the link for reporting bugs: 
-\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599}
+The 14bit pic port uses a different set of regression tests 
+\begin_inset LatexCommand \index{Regression test (PIC14)}
 
 \end_inset 
 
+, you'll find them in the directory 
+\shape italic 
+sdcc/src/regression
+\shape default 
 .
- With SDCC on average having more than 200 downloads
-\begin_inset LatexCommand \index{download}
+\layout Section
 
-\end_inset 
+Use of SDCC in Education
+\layout Standard
 
- on sourceforge per day
+In short: 
+\emph on 
+highly
+\emph default 
+ encouraged
 \begin_inset Foot
 collapsed false
 
 \layout Standard
 
-220 daily downloads on average Jan-Sept 2006 and about 150 daily downloads
- between 2002 and 2005.
- This does not include other methods of distribution.
+the phrase "use in education" might evoke the association "
+\emph on 
+only
+\emph default 
+ fit for use in education".
+ This connotation is not intended but nevertheless risked as the licensing
+ of SDCC makes it difficult to offer educational discounts
 \end_inset 
 
- there must be some users.
- So it's not exactly easy to find a new bug.
- If you find one we need it: 
+.
+ If your rationales are to:
+\layout Enumerate
+
+give students a chance to understand the 
 \emph on 
-reporting bugs is good
+complete
 \emph default 
-.
-\layout Section
+ steps of code generation
+\layout Enumerate
 
-Requesting Features
-\begin_inset LatexCommand \label{sub:Requesting-Features}
+have a curriculum that can be extended for years.
+ Then you could use an fpga board as target and your curriculum will seamlessly
+ extend from logic synthesis (
+\begin_inset LatexCommand \url[http://www.opencores.org]{opencores.org}
 
 \end_inset 
 
-
-\begin_inset LatexCommand \index{Feature request}
+, 
+\begin_inset LatexCommand \url[Oregano]{http://www.oregano.at/ip/ip01.htm}
 
 \end_inset 
 
-
-\begin_inset LatexCommand \index{Requesting features}
+), over assembly programming, to C to FPGA compilers (
+\begin_inset LatexCommand \url[FPGAC]{http://sf.net/projects/fpgac}
 
 \end_inset 
 
+) and to C.
+\layout Enumerate
 
-\layout Standard
-
-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}
+be able to insert excursions about skills like using a revision control
+ system, submitting/applying patches, using a type-setting (as opposed to
+ word-processing) engine LyX/LaTeX, using 
+\begin_inset LatexCommand \url[SourceForge]{http://www.sf.net}
 
 \end_inset 
 
-.
-\layout Section
+, following some 
+\begin_inset LatexCommand \url[netiquette]{http://en.wikipedia.org/wiki/Netiquette}
 
-Submitting patches
-\layout Standard
+\end_inset 
 
-Like bug reports contributed patches are forwarded to the developer mailing
- list.
- This is the link for submitting patches
-\begin_inset LatexCommand \index{Patch submission}
+, understanding BSD/LGPL/GPL/Proprietary licensing, growth models of Open
+ Source Software, CPU simulation, compiler regression tests
+\begin_inset LatexCommand \index{Regression test}
 
 \end_inset 
 
-: 
-\begin_inset LatexCommand \url{http://sourceforge.net/tracker/?group_id=599&atid=300599}
+.
+\newline 
+And if there should be a shortage of ideas then you can always point students
+ to the ever-growing feature request list 
+\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
 
 \end_inset 
 
 .
-\layout Standard
+\layout Enumerate
 
-You need to specify some parameters to the 
-\family typewriter 
-diff
-\family default 
- command for the patches to be useful.
- If you modified more than one file a patch created f.e.
- with 
-\family sans 
-\series bold 
+not tie students to a specific host platform and instead allow them to use
+ a host platform of 
+\emph on 
+their
+\emph default 
+ choice (among them Alpha, i386, i386_64, MacOs, Mips, Sparc, Windows and
+ eventually 
+\begin_inset LatexCommand \url[OLPC]{http://www.laptop.org}
 
-\begin_inset Quotes sld
 \end_inset 
 
-diff -Naur unmodified_directory modified_directory >my_changes.patch
-\begin_inset Quotes srd
-\end_inset 
+)
+\layout Enumerate
 
+not encourage students to use illegal copies of educational software
+\layout Enumerate
 
-\family default 
-\series default 
- will be fine, otherwise 
-\family sans 
-\series bold 
+be immune to licensing/availability/price changes of the chosen tool chain
+\layout Enumerate
 
-\begin_inset Quotes sld
-\end_inset 
+be able to change to a new target platform without having to adopt a new
+ tool chain
+\layout Enumerate
 
-diff -u sourcefile.c.orig sourcefile.c >my_changes.patch
-\begin_inset Quotes srd
-\end_inset 
+have complete control over and insight into the tool chain
+\layout Enumerate
 
+make your students aware about the pros and cons of open source software
+ development
+\layout Enumerate
 
-\series default 
-\family default 
-will do.
+give back to the public as you are probably at least partially publically
+ funded
+\layout Enumerate
+
+give students a chance to publically prove their skills and to possibly
+ see a world wide impact
+\layout Standard
+\pagebreak_bottom 
+then SDCC is probably among the first choices.
+ Well, probably SDCC might be the only choice.
+\layout Chapter
+
+SDCC Technical Data
 \layout Section
 
-Getting Help
+Optimizations
+\begin_inset LatexCommand \index{Optimizations}
+
+\end_inset 
+
+
 \layout Standard
 
-These links should take you directly to the 
-\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599}
+SDCC performs a host of standard optimizations in addition to some MCU specific
+ optimizations.
+\layout Subsection
+
+Sub-expression Elimination
+\begin_inset LatexCommand \index{Subexpression elimination}
 
 \end_inset 
 
 
-\begin_inset Foot
-collapsed false
+\layout Standard
+
+The compiler does local and 
+\emph on 
+g
+\emph default 
+lobal 
+\emph on 
+c
+\emph default 
+ommon 
+\emph on 
+s
+\emph default 
+ubexpression 
+\emph on 
+e
+\emph default 
+limination, e.g.: 
+\layout Verse
+
 
+\family typewriter 
+i = x + y + 1; 
+\newline 
+j = x + y;
 \layout Standard
 
-Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting
- automated messages (mid 2003)
-\end_inset 
+will be translated to
+\layout Verse
+
+
+\family typewriter 
+iTemp = x + y; 
+\newline 
+i = iTemp + 1; 
+\newline 
+j = iTemp;
+\layout Standard
 
- and the 
-\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599}
+Some subexpressions are not as obvious as the above example, e.g.:
+\layout Verse
 
-\end_inset 
 
-, lists
-\begin_inset LatexCommand \index{Mailing list(s)}
+\family typewriter 
+a->b[i].c = 10; 
+\newline 
+a->b[i].d = 11;
+\layout Standard
 
-\end_inset 
+In this case the address arithmetic a->b[i] will be computed only once;
+ the equivalent code in C would be.
+\layout Verse
 
- and forums are archived and searchable so if you are lucky someone already
- had a similar problem.
- While mails to the lists themselves are delivered promptly their web front
- end on sourceforge sometimes shows a severe time lag (up to several weeks),
- if you're seriously using SDCC please consider subscribing to the lists.
-\layout Section
 
-ChangeLog
+\family typewriter 
+iTemp = a->b[i]; 
+\newline 
+iTemp.c = 10; 
+\newline 
+iTemp.d = 11;
 \layout Standard
 
-You can follow the status of the Subversion version
-\begin_inset LatexCommand \index{version}
-
-\end_inset 
+The compiler will try to keep these temporary variables in registers.
+\layout Subsection
 
- of SDCC by watching the Changelog
-\begin_inset LatexCommand \index{Changelog}
+Dead-Code Elimination
+\begin_inset LatexCommand \index{Dead-code elimination}
 
 \end_inset 
 
- in the Subversion repository
-\size footnotesize 
-\begin_inset LatexCommand \htmlurl{http://svn.sourceforge.net/viewcvs.cgi/*checkout*/sdcc/trunk/sdcc/ChangeLog}
 
-\end_inset 
+\layout Verse
 
-.
-\layout Section
 
-Subversion Source Code Repository
+\family typewriter 
+int global;
+\newline 
+
+\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 
+}
 \layout Standard
 
-The output of 
-\family sans 
-\series bold 
-sdcc --version
-\family default 
-\series default 
- or the filenames of the snapshot versions of SDCC include date and its
- Subversion
-\begin_inset LatexCommand \index{Subversion code repository}
+will be changed to
+\layout Verse
 
-\end_inset 
 
- number.
- Subversion allows to download the source of recent or previous versions
-\begin_inset LatexCommand \url{http://sourceforge.net/svn/?group_id=599}
+\family typewriter 
+int global;
+\newline 
 
-\end_inset 
+\newline 
+void f () {
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+global = 2; 
+\newline 
+}
+\layout Subsection
 
- (by number or by date).
- An on-line source code browser and detailled instructions are also available
- there.
- SDCC versions starting from 1999 up to now are available (currently the
- versions prior to the conversion from cvs
-\begin_inset LatexCommand \index{cvs|see{Subversion}}
+Copy-Propagation
+\begin_inset LatexCommand \index{Copy propagation}
 
 \end_inset 
 
- to Subversion (April 2006) are either by accessible by Subversion or by
- cvs).
-\layout Section
-
-Release policy
-\begin_inset LatexCommand \index{Release policy}
 
-\end_inset 
+\layout Verse
 
 
+\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 
+}
 \layout Standard
 
-Historically there often were long delays between official releases and
- the sourceforge download area tends to get not updated at all.
- Excuses in the past might have referred to problems with live range analysis,
- but as this was fixed a while ago, the current problem is that another
- excuse has to be found.
- Kidding aside, we have to get better there! On the other hand there are
- daily snapshots available at 
-\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php}
+will be changed to 
+\layout Verse
 
-\end_inset 
 
-, and you can always build the very last version (hopefully with many bugs
- fixed, and features added) from the source code available at 
-\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source}
+\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 
+}
+\layout Standard
+
+Note: the dead stores created by this copy propagation will be eliminated
+ by dead-code elimination.
+\layout Subsection
+
+Loop Optimizations
+\begin_inset LatexCommand \index{Loop optimization}
 
 \end_inset 
 
-.
-\layout Section
 
-Examples
-\begin_inset LatexCommand \index{Examples}
+\begin_inset LatexCommand \label{sub:Loop-Optimizations}
 
 \end_inset 
 
 
 \layout Standard
 
-You'll find some small examples in the directory 
+Two types of loop optimizations are done by SDCC 
 \emph on 
-sdcc/device/examples/.
+loop invariant
 \emph default 
-More examples and libraries are available at
+ lifting and
 \emph on 
- The SDCC Open Knowledge Resource 
-\begin_inset LatexCommand \url{http://sdccokr.dl9sec.de/}
+ strength reduction
+\emph default 
+ 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 
 
-\emph default 
-web site or at 
-\begin_inset LatexCommand \url{http://www.pjrc.com/tech/8051/}
+, 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 
 
-.
-\layout Comment
+ / 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
 
-I did insert a reference to Paul's web site here although it seems rather
- dedicated to a specific 8032 board (I think it's okay because it f.e.
- shows LCD/Harddisc interface and has a free 8051 monitor.
- Independent 8032 board vendors face hard competition of heavily subsidized
- development boards anyway).
-\layout Comment
+\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 Section
+\backslash 
+/
+\end_inset 
 
-Quality control
-\begin_inset LatexCommand \label{sec:Quality-control}
+-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
+
 
-\begin_inset LatexCommand \index{Quality control}
+\family typewriter 
+for (i = 0 ; i < 100 ; i ++) 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+f += k + l;
+\layout Standard
 
-\end_inset 
+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
 
-The compiler is passed through nightly compile and build checks.
- The so called 
-\shape italic 
-regression tests
-\shape default 
+As mentioned previously some loop invariants are not as apparent, all static
+ address computations are also moved out of the loop.
+\newline 
 
-\begin_inset LatexCommand \index{Regression test}
+\newline 
+Strength Reduction
+\begin_inset LatexCommand \index{Strength reduction}
 
 \end_inset 
 
- check that SDCC itself compiles flawlessly on several host platforms (i386,
- Opteron, 64 bit Alpha, ppc64, MacOS X on PPC, Solaris on Sparc) and checks
- the quality of the code generated by SDCC by running the code for several
- target platforms through simulators.
- The regression test suite comprises more than 100 files which expand to
- more than 500 test cases which include more than 4500 tests.
- The results of these tests are published daily on SDCC's snapshot page
- (click on the red or green symbols on the right side of 
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/snap.php}
+, this optimization substitutes an expression by a cheaper expression:
+\layout Verse
 
-\end_inset 
 
-).
+\family typewriter 
+for (i=0;i < 100; i++)
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ar[i*5] = i*3;
 \layout Standard
 
-There is a separate document 
-\shape italic 
-test_suite.pdf 
-\begin_inset LatexCommand \index{Test suite}
+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 Subsection
 
-\shape default 
-\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/doc/test_suite_spec.pdf}
+Loop Reversing
+\begin_inset LatexCommand \index{Loop reversing}
 
 \end_inset 
 
- about the regression test suite.
-\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 
-\series bold 
+\layout Standard
 
-\begin_inset Quotes sld
+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 
 
-make test-mcs51
-\begin_inset Quotes srd
+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 
 
-\family default 
-\series 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}
+\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 
 
- checking corner cases of SDCC or if you plan to submit patches
-\begin_inset LatexCommand \index{Patch submission}
+continue
+\begin_inset Quotes erd
+\end_inset 
 
+ or 'break
+\begin_inset Quotes erd
 \end_inset 
 
 .
-\layout Standard
+\layout Itemize
 
-The 14bit pic port uses a different set of regression tests 
-\begin_inset LatexCommand \index{Regression test (PIC14)}
+All goto's are contained within the loop.
+\layout Itemize
 
-\end_inset 
+No function calls within the loop.
+\layout Itemize
 
-, you'll find them in the directory 
-\shape italic 
-sdcc/src/regression
-\shape default 
-.
-\layout Section
+The loop control variable <sym> is not assigned any value within the loop
+\layout Itemize
 
-Use of SDCC in Education
-\layout Standard
+The loop control variable does NOT participate in any arithmetic operation
+ within the loop.
+\layout Itemize
 
-In short: 
-\emph on 
-highly
-\emph default 
- encouraged
-\begin_inset Foot
-collapsed false
+There are NO switch statements in the loop.
+\layout Subsection
 
+Algebraic Simplifications
 \layout Standard
 
-the phrase "use in education" might evoke the association "
-\emph on 
-only
-\emph default 
- fit for use in education".
- This connotation is not intended but nevertheless risked as the licensing
- of SDCC makes it difficult to offer educational discounts
-\end_inset 
+SDCC does numerous algebraic simplifications, the following is a small sub-set
+ of these optimizations.
+\layout Verse
 
-.
- If your rationales are to:
-\layout Enumerate
 
-give students a chance to understand the 
-\emph on 
-complete
-\emph default 
- steps of code generation
-\layout Enumerate
+\family typewriter 
+i = j + 0;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ /* changed to: */\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ i = j; 
+\newline 
+i /= 2;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ /* changed to: */\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ i >>= 1; 
+\newline 
+i = j - j;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ /* changed to: */\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ i = 0; 
+\newline 
+i = j / 1;\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ /* changed to: */\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ i = j;
+\layout Standard
 
-have a curriculum that can be extended for years.
- Then you could use an fpga board as target and your curriculum will seamlessly
- extend from logic synthesis (
-\begin_inset LatexCommand \url[http://www.opencores.org]{opencores.org}
+Note the subexpressions
+\begin_inset LatexCommand \index{Subexpression}
 
 \end_inset 
 
-, 
-\begin_inset LatexCommand \url[Oregano]{http://www.oregano.at/ip/ip01.htm}
-
-\end_inset 
+ given above are generally introduced by macro expansions or as a result
+ of copy/constant propagation.
+\layout Subsection
 
-), over assembly programming, to C to FPGA compilers (
-\begin_inset LatexCommand \url[FPGAC]{http://sf.net/projects/fpgac}
+'switch' Statements
+\begin_inset LatexCommand \label{sub:'switch'-Statements}
 
 \end_inset 
 
-) and to C.
-\layout Enumerate
-
-be able to insert excursions about skills like using a revision control
- system, submitting/applying patches, using a type-setting (as opposed to
- word-processing) engine LyX/LaTeX, using 
-\begin_inset LatexCommand \url[SourceForge]{http://www.sf.net}
-
-\end_inset 
 
-, following some 
-\begin_inset LatexCommand \url[netiquette]{http://en.wikipedia.org/wiki/Netiquette}
+\begin_inset LatexCommand \index{switch statement}
 
 \end_inset 
 
-, understanding BSD/LGPL/GPL/Proprietary licensing, growth models of Open
- Source Software, CPU simulation, compiler regression tests
-\begin_inset LatexCommand \index{Regression test}
 
-\end_inset 
+\layout Standard
 
-.
-\newline 
-And if there should be a shortage of ideas then you can always point students
- to the ever-growing feature request list 
-\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599}
+SDCC can optimize switch statements to jump tables
+\begin_inset LatexCommand \index{jump tables}
 
 \end_inset 
 
 .
-\layout Enumerate
-
-not tie students to a specific host platform and instead allow them to use
- a host platform of 
-\emph on 
-their
-\emph default 
- choice (among them Alpha, i386, i386_64, MacOs, Mips, Sparc, Windows and
- eventually 
-\begin_inset LatexCommand \url[OLPC]{http://www.laptop.org}
-
-\end_inset 
-
-)
-\layout Enumerate
-
-not encourage students to use illegal copies of educational software
-\layout Enumerate
-
-be immune to licensing/availability/price changes of the chosen tool chain
-\layout Enumerate
-
-be able to change to a new target platform without having to adopt a new
- tool chain
-\layout Enumerate
-
-have complete control over and insight into the tool chain
-\layout Enumerate
-
-make your students aware about the pros and cons of open source software
- development
-\layout Enumerate
-
-give back to the public as you are probably at least partially publically
- funded
-\layout Enumerate
-
-give students a chance to publically prove their skills and to possibly
- see a world wide impact
-\layout Standard
-
-then SDCC is probably among the first choices.
- Well, probably SDCC might be the only choice.
-\layout Chapter
-\pagebreak_top 
-SDCC Technical Data
-\layout Section
-
-Optimizations
-\begin_inset LatexCommand \index{Optimizations}
+ It makes the decision based on an estimate of the generated code size.
+ SDCC is quite liberal in the requirements for jump table generation: 
+\layout Itemize
 
-\end_inset 
+The labels need not be in order, and the starting number need not be one
+ or zero, the case labels are in numerical sequence or not too many case
+ labels are missing.
+\begin_deeper 
+\layout Verse
 
 
-\layout Standard
+\family typewriter 
+switch(i) {\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+switch (i) { 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 4: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 0: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 5: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 1: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 3: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
 
-SDCC performs a host of standard optimizations in addition to some MCU specific
- optimizations.
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 6: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 3: ...
  
-\layout Subsection
-
-Sub-expression Elimination
-\begin_inset LatexCommand \index{Subexpression elimination}
-
-\end_inset 
-
-
-\layout Standard
-
-The compiler does local and 
-\emph on 
-g
-\emph default 
-lobal 
-\emph on 
-c
-\emph default 
-ommon 
-\emph on 
-s
-\emph default 
-ubexpression 
-\emph on 
-e
-\emph default 
-limination, e.g.: 
-\layout Verse
-
-
-\family typewriter 
-i = x + y + 1; 
 \newline 
-j = x + y;
-\layout Standard
-
-will be translated to
-\layout Verse
-
-
-\family typewriter 
-iTemp = x + y; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 7: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 4: ...
 \newline 
-i = iTemp + 1; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 8: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 5: ...
 \newline 
-j = iTemp;
-\layout Standard
-
-Some subexpressions are not as obvious as the above example, e.g.:
-\layout Verse
-
-
-\family typewriter 
-a->b[i].c = 10; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 9: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 6: ...
 \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]; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 10: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 7: ...
 \newline 
-iTemp.c = 10; 
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 11: ...\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+case 8: ...
 \newline 
-iTemp.d = 11;
+}\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+}
 \layout Standard
 
-The compiler will try to keep these temporary variables in registers.
-\layout Subsection
+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 boundary of the jump-table is not needed.
+\end_deeper 
+\layout Itemize
 
-Dead-Code Elimination
-\begin_inset LatexCommand \index{Dead-code elimination}
+The number of case labels is not larger than supported by the target architectur
+e.
+\layout Itemize
 
-\end_inset 
+If the case labels are not in numerical sequence ('gaps' between cases)
+ SDCC checks whether a jump table with additionally inserted dummy cases
+ is still attractive.
+\layout Itemize
 
+If the starting number is not zero and a check for the lower boundary of
+ the jump-table can thus be eliminated SDCC might insert dummy cases 0,
+ ...
+ .
+\layout Standard
 
+Switch statements which have large gaps in the numeric sequence or those
+ that have too many case labels can be split into more than one switch statement
+ for efficient code generation, e.g.:
 \layout Verse
 
 
 \family typewriter 
-int global;
+switch (i) { 
 \newline 
-
+\SpecialChar ~
+\SpecialChar ~
+case 1: ...
 \newline 
-void f () { 
+\SpecialChar ~
+\SpecialChar ~
+case 2: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-int i; 
+case 3: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-i = 1; \SpecialChar ~
+case 4: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+case 5: ...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
-/* dead store */ 
+case 6: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-global = 1;\SpecialChar ~
-/* dead store */ 
+case 7: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-global = 2; 
+case 101: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-return; 
+case 102: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-global = 3;\SpecialChar ~
-/* unreachable */ 
+case 103: ...
 \newline 
-}
-\layout Standard
-
-will be changed to
-\layout Verse
-
-
-\family typewriter 
-int global;
+\SpecialChar ~
+\SpecialChar ~
+case 104: ...
 \newline 
-
+\SpecialChar ~
+\SpecialChar ~
+case 105: ...
 \newline 
-void f () {
+\SpecialChar ~
+\SpecialChar ~
+case 106: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-global = 2; 
+case 107: ...
 \newline 
 }
-\layout Subsection
-
-Copy-Propagation
-\begin_inset LatexCommand \index{Copy propagation}
-
-\end_inset 
-
+\layout Standard
 
+If the above switch statement is broken down into two switch statements
 \layout Verse
 
 
 \family typewriter 
-int f() { 
+switch (i) { 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-int i, j; 
+case 1: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-i = 10; 
+case 2: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-j = i; 
+case 3: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-return j; 
+case 4: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+case 5: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+case 6: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+case 7: ...
 \newline 
 }
 \layout Standard
 
-will be changed to 
+and
 \layout Verse
 
 
 \family typewriter 
-int f() { 
+switch (i) { 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-int i, j; 
+case 101: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-i = 10; 
+case 102: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-j = 10; 
+case 103: ...
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-return 10; 
+case 104: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+case 105: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+case 106: ...
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+case 107: ...
 \newline 
 }
 \layout Standard
 
-Note: the dead stores created by this copy propagation will be eliminated
- by dead-code elimination.
-\layout Subsection
-
-Loop Optimizations
-\begin_inset LatexCommand \index{Loop optimization}
+then both the switch statements will be implemented using jump-tables whereas
+ the unmodified switch statement will not be.
+\layout Standard
 
-\end_inset 
 
+\begin_inset Note
+collapsed true
 
-\begin_inset LatexCommand \label{sub:Loop-Optimizations}
+\layout Standard
 
+There might be reasons which SDCC cannot know about to either favour or
+ not favour jump tables.
+ If the target system has to be as quick for the last switch case as for
+ the first (pro jump table), or if the switch argument is known to be zero
+ in the majority of the cases (contra jump table).
 \end_inset 
 
 
 \layout Standard
 
-Two types of loop optimizations are done by SDCC 
+The pragma nojtbound
+\begin_inset LatexCommand \index{\#pragma nojtbound}
+
+\end_inset 
+
+ can be used to turn off checking the 
 \emph on 
-loop invariant
+j
 \emph default 
- lifting and
+ump 
 \emph on 
- strength reduction
+t
 \emph default 
- 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}
+able 
+\emph on 
+bound
+\emph default 
+aries.
+ It has no effect if a default label is supplied.
+ Use of this pragma is dangerous: if the switch
+\begin_inset LatexCommand \index{switch statement}
 
 \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}
+ argument is not matched by a case statement the processor will happily
+ jump into Nirvana.
+\layout Subsection
 
-\end_inset 
+Bit-shifting Operations
+\begin_inset LatexCommand \index{Bit shifting}
 
- / 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
+\end_inset 
 
+.
 \layout Standard
 
-\backslash 
-/
-\end_inset 
+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
 
--noinduction option) or for a given function only using #pragma\SpecialChar ~
-noinduction
-\begin_inset LatexCommand \index{\#pragma noinduction}
 
-\end_inset 
+\family typewriter 
+unsigned char i;
+\newline 
+...
+\newline 
+i >>= 4; 
+\newline 
+...
+\layout Standard
 
-.
+generates the following code:
+\layout Verse
+
+
+\family typewriter 
+mov\SpecialChar ~
+ a,_i 
+\newline 
+swap a 
+\newline 
+anl\SpecialChar ~
+ a,#0x0f 
 \newline 
+mov\SpecialChar ~
+ _i,a
+\layout Standard
 
-\newline 
-Loop Invariant:
+In general SDCC will never setup a loop if the shift count is known.
+ Another example:
 \layout Verse
 
 
 \family typewriter 
-for (i = 0 ; i < 100 ; i ++) 
+unsigned int i; 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-f += k + l;
+...
+\newline 
+i >>= 9; 
+\newline 
+...
 \layout Standard
 
-changed to
+will generate:
 \layout Verse
 
 
 \family typewriter 
-itemp = k + l; 
-\newline 
-for (i = 0; i < 100; i++) 
-\newline 
+mov\SpecialChar ~
 \SpecialChar ~
+a,(_i + 1) 
+\newline 
+mov\SpecialChar ~
 \SpecialChar ~
+(_i + 1),#0x00 
+\newline 
+clr\SpecialChar ~
 \SpecialChar ~
+c 
+\newline 
+rrc\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.
+a 
 \newline 
+mov\SpecialChar ~
+\SpecialChar ~
+_i,a
+\layout Subsection
 
-\newline 
-Strength Reduction
-\begin_inset LatexCommand \index{Strength reduction}
+Bit-rotation
+\begin_inset LatexCommand \index{Bit rotation}
 
 \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
+A special case of the bit-shift operation is bit rotation
+\begin_inset LatexCommand \index{rotating bits}
+
+\end_inset 
+
+, SDCC recognizes the following expression to be a left bit-rotation:
 \layout Verse
 
 
 \family typewriter 
-itemp1 = 0; 
-\newline 
-itemp2 = 0; 
-\newline 
-for (i=0;i< 100;i++) { 
-\newline 
+\series bold 
+unsigned
+\series default 
 \SpecialChar ~
 \SpecialChar ~
+char i;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-ar[itemp1] = itemp2; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-itemp1 += 5; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-itemp2 += 3; 
+/* unsigned is needed for rotation */ 
 \newline 
-}
-\layout Standard
-
-The more expensive multiplication
-\begin_inset LatexCommand \index{Multiplication}
-
-\end_inset 
-
- is changed to a less expensive addition.
-\layout Subsection
-
-Loop Reversing
-\begin_inset LatexCommand \index{Loop reversing}
-
-\end_inset 
+...
+\newline 
+i = ((i << 1) | (i >> 7)); 
+\family default 
 
+\newline 
 
+\family typewriter 
+...
 \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 
+will generate the following code:
+\layout Verse
 
-\newline 
 
 \family typewriter 
-for(<symbol> = <expression>; <sym> [< | <=] <expression>; [<sym>++ | <sym>
- += 1])
-\newline 
+mov\SpecialChar ~
 \SpecialChar ~
+a,_i 
+\newline 
+rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+a 
+\newline 
+mov\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
+_i,a
+\layout Standard
 
-The loop control variable <sym> is not assigned any value within the loop
-\layout Itemize
+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
 
-The loop control variable does NOT participate in any arithmetic operation
- within the loop.
-\layout Itemize
 
-There are NO switch statements in the loop.
+\family typewriter 
+i = ((i >> 7) | (i << 1)); /* left-bit rotation */
 \layout Subsection
 
-Algebraic Simplifications
+Nibble and Byte Swapping
 \layout Standard
 
-SDCC does numerous algebraic simplifications, the following is a small sub-set
- of these optimizations.
+Other special cases of the bit-shift operations are nibble or byte swapping
+\begin_inset LatexCommand \index{swapping nibbles/bytes}
+
+\end_inset 
+
+, SDCC recognizes the following expressions:
 \layout Verse
 
 
 \family typewriter 
-i = j + 0;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- /* changed to: */\SpecialChar ~
-\SpecialChar ~
+\series bold 
+unsigned
+\series default 
 \SpecialChar ~
 \SpecialChar ~
- i = j
+char i
 \newline 
-i /= 2;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- /* changed to: */\SpecialChar ~
-\SpecialChar ~
+
+\series bold 
+unsigned
+\series default 
 \SpecialChar ~
 \SpecialChar ~
- i >>= 1
+int j
 \newline 
-i = j - j;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- /* changed to: */\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- i = 0; 
+...
 \newline 
-i = j / 1;\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- /* changed to: */\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- i = j;
+i = ((i << 4) | (i >> 4)); 
+\family default 
+
+\newline 
+
+\family typewriter 
+j = ((j << 8) | (j >> 8)); 
+\layout Standard
+
+and generates a swap instruction for the nibble swapping
+\begin_inset LatexCommand \index{Nibble swapping}
+
+\end_inset 
+
+ or move instructions for the byte swapping
+\begin_inset LatexCommand \index{Byte swapping}
+
+\end_inset 
+
+.
+ The 
+\begin_inset Quotes sld
+\end_inset 
+
+j
+\begin_inset Quotes srd
+\end_inset 
+
+ example can be used to convert from little to big-endian or vice versa.
+ If you want to change the endianness of a 
+\emph on 
+signed
+\emph default 
+ integer you have to cast to 
+\family typewriter 
+(unsigned int)
+\family default 
+ first.
 \layout Standard
 
-Note the subexpressions
-\begin_inset LatexCommand \index{Subexpression}
+Note that SDCC stores numbers in little-endian
+\begin_inset Foot
+collapsed false
+
+\layout Standard
+
+Usually 8-bit processors don't care much about endianness.
+ This is not the case for the standard 8051 which only has an instruction
+ to increment its 
+\emph on 
+dptr
+\emph default 
+
+\begin_inset LatexCommand \index{DPTR}
 
 \end_inset 
 
- given above are generally introduced by macro expansions or as a result
- of copy/constant propagation.
-\layout Subsection
+-datapointer
+\emph on 
+\emph default 
+so little-endian is the more efficient byte order.
+\end_inset 
 
-'switch' Statements
-\begin_inset LatexCommand \label{sub:'switch'-Statements}
+
+\begin_inset LatexCommand \index{little-endian}
 
 \end_inset 
 
 
-\begin_inset LatexCommand \index{switch statement}
+\begin_inset LatexCommand \index{Endianness}
 
 \end_inset 
 
+ format (i.e.
+ lowest order first).
+\layout Subsection
 
-\layout Standard
+Highest Order Bit
+\begin_inset LatexCommand \index{Highest Order Bit}
 
-SDCC can optimize switch statements to jump tables
-\begin_inset LatexCommand \index{jump tables}
+\end_inset 
+
+ / Any Order Bit
+\begin_inset LatexCommand \index{Any Order Bit}
 
 \end_inset 
 
-.
- It makes the decision based on an estimate of the generated code size.
- SDCC is quite liberal in the requirements for jump table generation: 
-\layout Itemize
 
-The labels need not be in order, and the starting number need not be one
- or zero, the case labels are in numerical sequence or not too many case
- labels are missing.
-\begin_deeper 
+\layout Standard
+
+It is frequently required to obtain the highest order bit of an integral
+ type (long, int, short or char types).
+ Also obtaining any other order bit is not uncommon.
+ SDCC recognizes the following expressions to yield the highest order bit
+ and generates optimized code for it, e.g.:
 \layout Verse
 
 
 \family typewriter 
-switch(i) {\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+unsigned int gint; 
+\newline 
+
+\newline 
+foo () { 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+unsigned char hob1, aob1; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+bit hob2, hob3, aob2, aob3; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+hob1 = (gint >> 15) & 1; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+hob2 = (gint >> 15) & 1; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+hob3 = gint & 0x8000; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+aob1 = (gint >> 9) & 1; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+aob2 = (gint >> 8) & 1; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
-switch (i) { 
+aob3 = gint & 0x0800; 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-case 4: ...\SpecialChar ~
+..
+\newline 
+}
+\layout Standard
+
+will generate the following code:
+\layout Verse
+
+
+\family typewriter 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26820,16 +30133,10 @@ case 4: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 0: ...
+ 61 ;\SpecialChar ~
+ hob.c 7 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-case 5: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+000A E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26844,6 +30151,7 @@ case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 62\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26851,16 +30159,14 @@ case 5: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
-case 1: ...
+ a,(_gint + 1) 
 \newline 
+000C 23\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 3: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26875,6 +30181,7 @@ case 3: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 63\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26882,17 +30189,12 @@ case 3: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-
+ a 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-case 6: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+000D 54 01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26907,6 +30209,7 @@ case 6: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 64\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26914,17 +30217,11 @@ case 6: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ anl\SpecialChar ~
 \SpecialChar ~
-case 3: ...
+ a,#0x01 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-case 7: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+000F F5*02\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26939,6 +30236,7 @@ case 7: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 65\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26946,17 +30244,13 @@ case 7: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
-case 4: ...
+ _foo_hob1_1_1,a 
 \newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 8: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -26979,16 +30273,10 @@ case 8: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 5: ...
+ 66 ;\SpecialChar ~
+ hob.c 8 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-case 9: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+0011 E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27003,6 +30291,7 @@ case 9: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 67\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27010,16 +30299,14 @@ case 9: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
-case 6: ...
+ a,(_gint + 1) 
 \newline 
+0013 33\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 10: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27034,6 +30321,7 @@ case 10: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 68\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27041,16 +30329,11 @@ case 10: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ rlc\SpecialChar ~
 \SpecialChar ~
-case 7: ...
+ a 
 \newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-case 11: ...\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
+0014 92*00\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27065,6 +30348,7 @@ case 11: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 69\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27072,16 +30356,10 @@ case 11: ...\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
-case 8: ...
+ _foo_hob2_1_1,c 
 \newline 
-}\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27107,595 +30385,149 @@ case 8: ...
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\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 boundary of the jump-table is not needed.
-\end_deeper 
-\layout Itemize
-
-The number of case labels is not larger than supported by the target architectur
-e.
-\layout Itemize
-
-If the case labels are not in numerical sequence ('gaps' between cases)
- SDCC checks whether a jump table with additionally inserted dummy cases
- is still attractive.
-\layout Itemize
-
-If the starting number is not zero and a check for the lower boundary of
- the jump-table can thus be eliminated SDCC might insert dummy cases 0,
- ...
- .
-\layout Standard
-
-Switch statements which have large gaps in the numeric sequence or those
- that have too many case labels can be split into more than one switch statement
- for efficient code generation, e.g.:
-\layout Verse
-
-
-\family typewriter 
-switch (i) { 
+ 66 ;\SpecialChar ~
+ hob.c 9 
 \newline 
+0016 E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 1: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 2: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 3: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 4: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 5: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 6: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 7: ...
-\newline 
+ 67\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 101: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 102: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 103: ...
-\newline 
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
-case 104: ...
+ a,(_gint + 1) 
 \newline 
+0018 33\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 105: ...
-\newline 
-\SpecialChar ~
 \SpecialChar ~
-case 106: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 107: ...
-\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 
 \SpecialChar ~
 \SpecialChar ~
-case 5: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 6: ...
-\newline 
+ 68\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 7: ...
-\newline 
-}
-\layout Standard
-
-and
-\layout Verse
-
-
-\family typewriter 
-switch (i) { 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 101: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 102: ...
-\newline 
 \SpecialChar ~
+ rlc\SpecialChar ~
 \SpecialChar ~
-case 103: ...
+ a 
 \newline 
+0019 92*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-case 104: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 105: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 106: ...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-case 107: ...
-\newline 
-}
-\layout Standard
-
-then both the switch statements will be implemented using jump-tables whereas
- the unmodified switch statement will not be.
-\layout Comment
-
-There might be reasons which SDCC cannot know about to either favour or
- not favour jump tables.
- If the target system has to be as quick for the last switch case as for
- the first (pro jump table), or if the switch argument is known to be zero
- in the majority of the cases (contra jump table).
-\layout Standard
-
-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.
- It has no effect if a default label is supplied.
- Use of this pragma is dangerous: if the switch
-\begin_inset LatexCommand \index{switch statement}
-
-\end_inset 
-
- argument is not matched by a case statement the processor will happily
- jump into Nirvana.
-\layout Subsection
-
-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\SpecialChar ~
- a,_i 
-\newline 
-swap a 
-\newline 
-anl\SpecialChar ~
- a,#0x0f 
-\newline 
-mov\SpecialChar ~
- _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 ~
-(_i + 1),#0x00 
-\newline 
-clr\SpecialChar ~
 \SpecialChar ~
-c 
-\newline 
-rrc\SpecialChar ~
 \SpecialChar ~
-a 
-\newline 
-mov\SpecialChar ~
 \SpecialChar ~
-_i,a
-\layout Subsection
-
-Bit-rotation
-\begin_inset LatexCommand \index{Bit rotation}
-
-\end_inset 
-
-
-\layout Standard
-
-A special case of the bit-shift operation is bit rotation
-\begin_inset LatexCommand \index{rotating bits}
-
-\end_inset 
-
-, SDCC recognizes the following expression to be a left bit-rotation:
-\layout Verse
-
-
-\family typewriter 
-\series bold 
-unsigned
-\series default 
+\SpecialChar ~
+ 69\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-char i;\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_hob3_1_1,c 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-/* unsigned is needed for rotation */ 
-\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 Subsection
-
-Nibble and Byte Swapping
-\layout Standard
-
-Other special cases of the bit-shift operations are nibble or byte swapping
-\begin_inset LatexCommand \index{swapping nibbles/bytes}
-
-\end_inset 
-
-, SDCC recognizes the following expressions:
-\layout Verse
-
-
-\family typewriter 
-\series bold 
-unsigned
-\series default 
 \SpecialChar ~
 \SpecialChar ~
-char i; 
-\newline 
-
-\series bold 
-unsigned
-\series default 
 \SpecialChar ~
 \SpecialChar ~
-int j; 
-\newline 
-...
-\newline 
-i = ((i << 4) | (i >> 4)); 
-\family default 
-
-\newline 
-
-\family typewriter 
-j = ((j << 8) | (j >> 8)); 
-\layout Standard
-
-and generates a swap instruction for the nibble swapping
-\begin_inset LatexCommand \index{Nibble swapping}
-
-\end_inset 
-
- or move instructions for the byte swapping
-\begin_inset LatexCommand \index{Byte swapping}
-
-\end_inset 
-
-.
- The 
-\begin_inset Quotes sld
-\end_inset 
-
-j
-\begin_inset Quotes srd
-\end_inset 
-
- example can be used to convert from little to big-endian or vice versa.
- If you want to change the endianness of a 
-\emph on 
-signed
-\emph default 
- integer you have to cast to 
-\family typewriter 
-(unsigned int)
-\family default 
- first.
-\layout Standard
-
-Note that SDCC stores numbers in little-endian
-\begin_inset Foot
-collapsed false
-
-\layout Standard
-
-Usually 8-bit processors don't care much about endianness.
- This is not the case for the standard 8051 which only has an instruction
- to increment its 
-\emph on 
-dptr
-\emph default 
-
-\begin_inset LatexCommand \index{DPTR}
-
-\end_inset 
-
--datapointer
-\emph on 
-\emph default 
-so little-endian is the more efficient byte order.
-\end_inset 
-
-
-\begin_inset LatexCommand \index{little-endian}
-
-\end_inset 
-
-
-\begin_inset LatexCommand \index{Endianness}
-
-\end_inset 
-
- format (i.e.
- lowest order first).
-\layout Subsection
-
-Highest Order Bit
-\begin_inset LatexCommand \index{Highest Order Bit}
-
-\end_inset 
-
- / Any Order Bit
-\begin_inset LatexCommand \index{Any 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).
- Also obtaining any other order bit is not uncommon.
- SDCC recognizes the following expressions 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 hob1, aob1; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-bit hob2, hob3, aob2, aob3; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-...
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-hob1 = (gint >> 15) & 1; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-hob2 = (gint >> 15) & 1; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-hob3 = gint & 0x8000; 
+\SpecialChar ~
+ 70 ;\SpecialChar ~
+ hob.c 10 
 \newline 
+001B E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
-aob1 = (gint >> 9) & 1; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-aob2 = (gint >> 8) & 1; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-aob3 = gint & 0x0800; 
-\newline 
 \SpecialChar ~
 \SpecialChar ~
-..
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ 71\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+\SpecialChar ~
+ mov\SpecialChar ~
+\SpecialChar ~
+ a,(_gint + 1) 
 \newline 
-}
-\layout Standard
-
-will generate the following code:
-\layout Verse
-
-
-\family typewriter 
+001D 03\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27713,6 +30545,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 72\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27720,11 +30553,12 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ rr\SpecialChar ~
 \SpecialChar ~
- 61 ;\SpecialChar ~
- hob.c 7 
+\SpecialChar ~
+ a 
 \newline 
-000A E5*01\SpecialChar ~
+001E 54 01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27739,7 +30573,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
62\SpecialChar ~
73\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27747,12 +30581,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
mov\SpecialChar ~
anl\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
+ a,#0x01 
 \newline 
-000C 23\SpecialChar ~
-\SpecialChar ~
+0020 F5*03\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27767,22 +30600,21 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 74\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 63\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_aob1_1_1,a 
+\newline 
 \SpecialChar ~
- rl\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- a 
-\newline 
-000D 54 01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27797,7 +30629,6 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 64\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27805,11 +30636,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- anl\SpecialChar ~
 \SpecialChar ~
- a,#0x01 
+ 75 ;\SpecialChar ~
+ hob.c 11 
 \newline 
-000F F5*02\SpecialChar ~
+0022 E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27824,7 +30655,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
65\SpecialChar ~
76\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27834,8 +30665,9 @@ will generate the following code:
 \SpecialChar ~
  mov\SpecialChar ~
 \SpecialChar ~
- _foo_hob1_1_1,a 
+ a,(_gint + 1) 
 \newline 
+0024 13\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27853,6 +30685,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 77\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27860,11 +30693,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ rrc\SpecialChar ~
 \SpecialChar ~
- 66 ;\SpecialChar ~
- hob.c 8 
+ a 
 \newline 
-0011 E5*01\SpecialChar ~
+0025 92*02\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27879,7 +30712,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
67\SpecialChar ~
78\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27889,9 +30722,8 @@ will generate the following code:
 \SpecialChar ~
  mov\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
+ _foo_aob2_1_1,c 
 \newline 
-0013 33\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27909,7 +30741,6 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 68\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27917,11 +30748,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- rlc\SpecialChar ~
 \SpecialChar ~
- a 
+ 79 ;\SpecialChar ~
+ hob.c 12 
 \newline 
-0014 92*00\SpecialChar ~
+0027 E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27936,7 +30767,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
69\SpecialChar ~
80\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27946,8 +30777,9 @@ will generate the following code:
 \SpecialChar ~
  mov\SpecialChar ~
 \SpecialChar ~
- _foo_hob2_1_1,c 
+ a,(_gint + 1) 
 \newline 
+0029 A2 E3\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27962,6 +30794,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 81\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27969,14 +30802,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 66 ;\SpecialChar ~
- hob.c 9 
+ c,acc[3] 
 \newline 
-0016 E5*01\SpecialChar ~
+002B 92*03\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -27991,7 +30821,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
67\SpecialChar ~
82\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28001,39 +30831,102 @@ will generate the following code:
 \SpecialChar ~
  mov\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
+ _foo_aob3_1_1,c 
+\layout Standard
+
+Other variations of these cases however will 
+\emph on 
+not
+\emph default 
+ be recognized.
+ They are standard C expressions, so I heartily recommend these 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 Subsection
+
+Higher Order Byte
+\begin_inset LatexCommand \index{Higher Order Byte}
+
+\end_inset 
+
+ / Higher Order Word
+\begin_inset LatexCommand \index{Higher Order Word}
+
+\end_inset 
+
+
+\layout Standard
+
+It is also frequently required to obtain a higher order byte or word of
+ a larger integral type (long, int or short types).
+ SDCC recognizes the following expressions to yield the higher order byte
+ or word and generates optimized code for it, e.g.:
+\layout Verse
+
+
+\family typewriter 
+unsigned int gint; 
+\newline 
+unsigned long int glong; 
+\newline 
+
+\newline 
+foo () { 
 \newline 
-0018 33\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+unsigned char hob1, hob2; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+unsigned int how1, how2; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+hob1 = (gint >> 8) & 0xFF; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+hob2 = glong >> 24; 
+\newline 
 \SpecialChar ~
- 68\SpecialChar ~
 \SpecialChar ~
+how1 = (glong >> 16) & 0xFFFF; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+how2 = glong >> 8; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
+..
+\newline 
+}
+\layout Standard
+
+will generate the following code:
+\layout Verse
+
+
+\family typewriter 
 \SpecialChar ~
 \SpecialChar ~
- rlc\SpecialChar ~
 \SpecialChar ~
- a 
-\newline 
-0019 92*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28048,7 +30941,6 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 69\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28056,10 +30948,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- mov\SpecialChar ~
 \SpecialChar ~
- _foo_hob3_1_1,c 
+ 91 ;\SpecialChar ~
+ hob.c 15 
 \newline 
+0037 85*01*06\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28071,6 +30964,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 92\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28078,17 +30972,16 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_hob1_1_1,(_gint + 1) 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 70 ;\SpecialChar ~
- hob.c 10 
-\newline 
-001B E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28103,19 +30996,18 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 71\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 93 ;\SpecialChar ~
+ hob.c 16 
+\newline 
+003A 85*05*07\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- mov\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
-\newline 
-001D 03\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28124,6 +31016,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 94\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28131,9 +31024,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_hob2_1_1,(_glong + 3) 
+\newline 
 \SpecialChar ~
- 72\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28141,12 +31036,8 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- rr\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- a 
-\newline 
-001E 54 01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28161,23 +31052,23 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 73\SpecialChar ~
 \SpecialChar ~
+ 95 ;\SpecialChar ~
+ hob.c 17 
+\newline 
+003D 85*04*08\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- anl\SpecialChar ~
 \SpecialChar ~
- a,#0x01 
-\newline 
-0020 F5*03\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 96\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28185,10 +31076,13 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_how1_1_1,(_glong + 2) 
+\newline 
+0040 85*05*09\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 74\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28196,11 +31090,9 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- mov\SpecialChar ~
 \SpecialChar ~
- _foo_aob1_1_1,a 
-\newline 
 \SpecialChar ~
+ 97\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28208,7 +31100,11 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ (_foo_how1_1_1 + 1),(_glong + 3) 
+\newline 
+0043 85*03*0A\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28220,18 +31116,19 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ 98\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 75 ;\SpecialChar ~
- hob.c 11 
-\newline 
-0022 E5*01\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+ mov\SpecialChar ~
 \SpecialChar ~
+ _foo_how2_1_1,(_glong + 1) 
+\newline 
+0046 85*04*0B\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28243,7 +31140,7 @@ will generate the following code:
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
76\SpecialChar ~
99\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
@@ -28253,1525 +31150,2746 @@ will generate the following code:
 \SpecialChar ~
  mov\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
+ (_foo_how2_1_1 + 1),(_glong + 2) 
+\layout Standard
+
+Again, variations of these cases may 
+\emph on 
+not
+\emph default 
+ be recognized.
+ They are standard C expressions, so I heartily recommend these be the only
+ way to get the higher order byte/word, (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 >> 8) & 0xFF);
+\layout Standard
+
+will still be recognized.
+\layout Subsection
+
+Peephole Optimizer
+\begin_inset LatexCommand \label{sub:Peephole-Optimizer}
+
+\end_inset 
+
+
+\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\SpecialChar ~
+@\SpecialChar ~
+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 
-0024 13\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
- 77\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- rrc\SpecialChar ~
 \SpecialChar ~
- 
+mov %1,
 \newline 
-0025 92*02\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 78\SpecialChar ~
-\SpecialChar ~
 \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
+\begin_inset LatexCommand \index{MCS51 variants}
+
+\end_inset 
+
+ 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 ~
- mov\SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ \SpecialChar ~
+ <assembly sequence> '
+\backslash 
+n' 
+\newline 
 \SpecialChar ~
- _foo_aob2_1_1,c 
+ \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 innermost '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 Section
+
+ANSI-Compliance
+\begin_inset LatexCommand \index{ANSI-compliance}
+
+\end_inset 
+
+
+\begin_inset LatexCommand \label{sub:ANSI-Compliance}
+
+\end_inset 
+
+
+\layout Standard
+
+The latest publically available version of the standard 
+\emph on 
+ISO/IEC 9899 - Programming languages - C
+\emph default 
+ should be available at: 
+\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899}
+
+\end_inset 
+
+.
+\newline 
+
+\layout Standard
+
+Deviations from the compliance:
+\layout Itemize
+
+functions are not reentrant
+\begin_inset LatexCommand \index{reentrant}
+
+\end_inset 
+
+ unless explicitly declared as such or the 
+\series bold 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-stack-auto
+\begin_inset LatexCommand \index{-\/-stack-auto}
+
+\end_inset 
+
+
+\series default 
+ command line option is specified.
+\layout Itemize
+
+structures
+\begin_inset LatexCommand \index{struct}
+
+\end_inset 
+
+ and unions
+\begin_inset LatexCommand \index{union}
+
+\end_inset 
+
+ cannot be assigned values directly, cannot be passed as function parameters
+ or assigned to each other and cannot be a return value
+\begin_inset LatexCommand \index{return value}
+
+\end_inset 
+
+ from a function, e.g.:
+\begin_deeper 
+\layout Verse
+
+
+\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 ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 79 ;\SpecialChar ~
- hob.c 12 
+...
+\newline 
+}
+\newline 
+
+\series bold 
+struct
+\series default 
+ s foo1 (
+\series bold 
+struct
+\series default 
+ s parms) /* invalid in SDCC although allowed in ANSI */
+\newline 
+{ 
 \newline 
-0027 E5*01\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+struct s rets; 
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+...
+\newline 
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
- 80\SpecialChar ~
+return rets; /* is invalid in SDCC although allowed in ANSI */ 
+\newline 
+}
+\end_deeper 
+\layout Itemize
+
+initialization of structure arrays must be fully braced.
+\begin_deeper 
+\layout Verse
+
+
+\family typewriter 
+struct s { char x } a[] = {1, 2};\SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
 \SpecialChar ~
+/* invalid in SDCC */
+\newline 
+struct s { char x } a[] = {{1}, {2}}; /* OK */
+\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
+
+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 ~
- mov\SpecialChar ~
 \SpecialChar ~
- a,(_gint + 1) 
+...
+\newline 
+}
+\end_deeper 
+\layout Itemize
+
+Most enhancements in C99 are not supported, f.e.:
+\begin_deeper 
+\layout Verse
+
+
+\family typewriter 
+\series bold 
+inline
+\begin_inset LatexCommand \index{inline (not supported)}
+
+\end_inset 
+
+
+\series default 
+ int increment (int a) { return a+1; } /* is invalid in SDCC although allowed
+ in C99.
+ An empty define 
+\emph on 
+#define inline
+\emph default 
+ can be used as a work around */
+\newline 
+
+\newline 
+for (
+\series bold 
+int
+\series default 
+ i=0; i<10; i++) /* is invalid in SDCC although allowed in C99 */
+\end_deeper 
+\layout Itemize
+
+Certain words that are valid identifiers in the standard may be reserved
+ words in SDCC unless the 
+\series bold 
+-
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-std-c89
+\begin_inset LatexCommand \index{-\/-std-c89}
+
+\end_inset 
+
+ or -
+\begin_inset ERT
+status Collapsed
+
+\layout Standard
+
+\backslash 
+/
+\end_inset 
+
+-std-c99
+\begin_inset LatexCommand \index{-\/-std-c99}
+
+\end_inset 
+
+
+\series default 
+ command line options are used.
+ These may include (depending on the selected processor): 'at', 'banked',
+ 'bit', 'code', 'critical', 'data', 'eeprom', 'far', 'flash', 'idata', 'interrup
+t', 'near', 'nonbanked', 'pdata', 'reentrant', 'sbit', 'sfr', 'shadowregs',
+ 'sram', 'using', 'wparam', 'xdata', '_overlay', '_asm', '_endasm', and
+ '_naked'.
+ Compliant equivalents of these keywords are always available in a form
+ that begin with two underscores
+\begin_inset LatexCommand \index{\_\_ (prefix for extended keywords)}
+
+\end_inset 
+
+, f.e.
+ '__data' instead of 'data'.
+\layout Section
+
+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:
+\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
+
+Retargetting for other Processors
+\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
+
+\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 
+
+\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.
+ 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
+
+Phase five is register allocation.
+ There are two parts to this process.
 \newline 
-0029 A2 E3\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 81\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- c,acc[3] 
+
 \newline 
-002B 92*03\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 82\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- _foo_aob3_1_1,c 
+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 
+
+\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
+
+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
+
+As mentioned in the optimization section the peep-hole optimizer is rule
+ based system, which can reprogrammed for other MCUs.
+\layout Standard
+
+More information is available in a wiki
+\begin_inset LatexCommand \index{wiki}
+
+\end_inset 
+
+ (preliminary link 
+\begin_inset LatexCommand \url{http://sdcc.sourceforge.net/release_wiki/index.php?page=SDCC+internals+and+porting}
+
+\end_inset 
+
+) and in the thread 
+\begin_inset LatexCommand \url{http://sf.net/mailarchive/message.php?msg_id=13954144}
+
+\end_inset 
+
+ .
+\layout Chapter
+
+Compiler internals
+\begin_inset LatexCommand \index{Compiler internals}
+
+\end_inset 
+
+
+\layout Section
+
+The anatomy of the compiler
+\begin_inset LatexCommand \label{sub:The-anatomy-of}
+
+\end_inset 
+
+
+\layout Standard
+
+
+\shape italic 
+This is an excerpt from an article published in Circuit Cellar Magazine
+ in 
+\series bold 
+August 2000
+\series default 
+.
+ It's a little outdated (the compiler is much more efficient now and user/develo
+per friendly), but pretty well exposes the guts of it all.
+\shape default 
+
+\newline 
+
+\newline 
+The current version of SDCC can generate code for Intel 8051 and Z80 MCU.
+ It is fairly easy to retarget for other 8-bit MCU.
+ Here we take a look at some of the internals of the compiler.
+\layout Paragraph*
+
+Parsing
+\begin_inset LatexCommand \index{Parsing}
+
+\end_inset 
+
+\layout Standard
+
+Parsing the input source file and creating an AST (Annotated Syntax Tree
+\begin_inset LatexCommand \index{Annotated syntax tree}
+
+\end_inset 
+
+).
+ This phase also involves propagating types (annotating each node of the
+ parse tree with type information) and semantic analysis.
+ There are some MCU specific parsing rules.
+ For example the storage classes, the extended storage classes are MCU specific
+ while there may be a xdata storage class for 8051 there is no such storage
+ class for z80 or Atmel AVR.
+ SDCC allows MCU specific storage class extensions, i.e.
+ xdata will be treated as a storage class specifier when parsing 8051 C
+ code but will be treated as a C identifier when parsing z80 or ATMEL AVR
+ C code.
+\layout Paragraph*
+
+Generating iCode
+\begin_inset LatexCommand \index{iCode}
+
+\end_inset 
+
+
+\layout Standard
+
+Intermediate code generation.
+ In this phase the AST is broken down into three-operand form (iCode).
+ These three operand forms are represented as doubly linked lists.
+ ICode is the term given to the intermediate form generated by the compiler.
+ ICode example section shows some examples of iCode generated for some simple
+ C source functions.
+\layout Paragraph*
+
+Optimizations
+\begin_inset LatexCommand \index{Optimizations}
+
+\end_inset 
+
+.
+\layout Standard
+
+Bulk of the target independent optimizations is performed in this phase.
+ The optimizations include constant propagation, common sub-expression eliminati
+on, loop invariant code movement, strength reduction of loop induction variables
+ and dead-code elimination.
+\layout Paragraph*
+
+Live range analysis
+\begin_inset LatexCommand \index{Live range analysis}
+
+\end_inset 
+
+
+\layout Standard
+
+During intermediate code generation phase, the compiler assumes the target
+ machine has infinite number of registers and generates a lot of temporary
+ variables.
+ The live range computation determines the lifetime of each of these compiler-ge
+nerated temporaries.
+ A picture speaks a thousand words.
+ ICode example sections show the live range annotations for each of the
+ operand.
+ It is important to note here, each iCode is assigned a number in the order
+ of its execution in the function.
+ The live ranges are computed in terms of these numbers.
+ The from number is the number of the iCode which first defines the operand
+ and the to number signifies the iCode which uses this operand last.
+\layout Paragraph*
+
+Register Allocation
+\begin_inset LatexCommand \index{Register allocation}
+
+\end_inset 
+
+
+\layout Standard
+
+The register allocation determines the type and number of registers needed
+ by each operand.
+ In most MCUs only a few registers can be used for indirect addressing.
+ In case of 8051 for example the registers R0 & R1 can be used to indirectly
+ address the internal ram and DPTR to indirectly address the external ram.
+ The compiler will try to allocate the appropriate register to pointer variables
+ if it can.
+ ICode example section shows the operands annotated with the registers assigned
+ to them.
+ The compiler will try to keep operands in registers as much as possible;
+ there are several schemes the compiler uses to do achieve this.
+ When the compiler runs out of registers the compiler will check to see
+ if there are any live operands which is not used or defined in the current
+ basic block being processed, if there are any found then it will push that
+ operand and use the registers in this block, the operand will then be popped
+ at the end of the basic block.
+\layout Standard
+
+There are other MCU specific considerations in this phase.
+ Some MCUs have an accumulator; very short-lived operands could be assigned
+ to the accumulator instead of a general-purpose register.
+\layout Paragraph*
+
+Code generation
+\layout Standard
+
+Figure II gives a table of iCode
+\begin_inset LatexCommand \index{iCode}
+
+\end_inset 
+
+ operations supported by the compiler.
+ The code generation involves translating these operations into corresponding
+ assembly code for the processor.
+ This sounds overly simple but that is the essence of code generation.
+ Some of the iCode operations are generated on a MCU specific manner for
+ example, the z80 port does not use registers to pass parameters so the
+ SEND and RECV iCode operations will not be generated, and it also does
+ not support JUMPTABLES.
+\newline 
+
+\layout Standard
+
+
+\size footnotesize 
+Figure II 
+\begin_inset  Tabular
+<lyxtabular version="3" rows="39" columns="4">
+<features islongtable="true" headBottomDL="true">
+<column alignment="block" valignment="top" leftline="true" width="13col%">
+<column alignment="left" valignment="top" leftline="true" width="13col%">
+<column alignment="block" valignment="top" leftline="true" width="22col%">
+<column alignment="block" valignment="top" leftline="true" rightline="true" width="40col%">
+<row topline="true" bottomline="true" endhead="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
+iCode
+\series default 
+
+\begin_inset LatexCommand \index{iCode}
+
+\end_inset 
+
+
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
+Operands
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
+Description
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\series bold 
+C Equivalent
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'!'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+NOT operation 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = ! IC_LEFT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'~'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Bitwise complement of 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = ~IC_LEFT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+RRC
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Rotate right with carry
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = (IC_LEFT << 1) | (IC_LEFT >> (sizeof(IC_LEFT)*8-1));
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+RLC
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Rotate left with carry
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = (IC_LEFT << (sizeof(LC_LEFT)*8-1) ) | (IC_LEFT >> 1);
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+GETHBIT
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Get the highest order bit of IC_LEFT
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = (IC_LEFT >> (sizeof(IC_LEFT)*8 -1));
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+UNARYMINUS
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Unary minus
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = - IC_LEFT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IPUSH
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Push the operand into stack
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+NONE
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IPOP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Pop the operand from the stack 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+NONE
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+CALL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Call the function represented by IC_LEFT 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT();
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+PCALL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Call via function pointer
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = (*IC_LEFT)();
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+RETURN
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Return the value in operand IC_LEFT 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+return IC_LEFT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+LABEL
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LABEL() 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Label
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LABEL:
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
-Other variations of these cases however will 
-\emph on 
-not
-\emph default 
- be recognized.
- They are standard C expressions, so I heartily recommend these 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
 
+\size footnotesize 
+GOTO
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-xyz = gint + ((gint >> 15) & 1);
 \layout Standard
 
-will still be recognized.
-\layout Subsection
 
-Higher Order Byte
-\begin_inset LatexCommand \index{Higher Order Byte}
+\size footnotesize 
+IC_LABEL() 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
 
+\size footnotesize 
+Goto label
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
- / Higher Order Word
-\begin_inset LatexCommand \index{Higher Order Word}
 
+\size footnotesize 
+goto IC_LABEL();
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
+
+
+\size footnotesize 
+'+'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-It is also frequently required to obtain a higher order byte or word of
- a larger integral type (long, int or short types).
- SDCC recognizes the following expressions to yield the higher order byte
- or word and generates optimized code for it, e.g.:
-\layout Verse
 
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-unsigned int gint; 
-\newline 
-unsigned long int glong; 
-\newline 
+\layout Standard
+
+
+\size footnotesize 
+Addition
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT + IC_RIGHT
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'-'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Subtraction
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT - IC_RIGHT 
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'*'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Multiplication 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT * IC_RIGHT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'/'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Division
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT / IC_RIGHT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'%'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\newline 
-foo () { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-unsigned char hob1, hob2; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-unsigned int how1, how2; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-...
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-hob1 = (gint >> 8) & 0xFF; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-hob2 = glong >> 24; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-how1 = (glong >> 16) & 0xFFFF; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-how2 = glong >> 8; 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-..
-\newline 
-}
 \layout Standard
 
-will generate the following code:
-\layout Verse
 
+\size footnotesize 
+Modulus
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT % IC_RIGHT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+'<'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 91 ;\SpecialChar ~
- hob.c 15 
-\newline 
-0037 85*01*06\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 92\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- _foo_hob1_1_1,(_gint + 1) 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 93 ;\SpecialChar ~
- hob.c 16 
-\newline 
-003A 85*05*07\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 94\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- _foo_hob2_1_1,(_glong + 3) 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 95 ;\SpecialChar ~
- hob.c 17 
-\newline 
-003D 85*04*08\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 96\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- _foo_how1_1_1,(_glong + 2) 
-\newline 
-0040 85*05*09\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 97\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- (_foo_how1_1_1 + 1),(_glong + 3) 
-\newline 
-0043 85*03*0A\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 98\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- _foo_how2_1_1,(_glong + 1) 
-\newline 
-0046 85*04*0B\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- 99\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
- mov\SpecialChar ~
-\SpecialChar ~
- (_foo_how2_1_1 + 1),(_glong + 2) 
 \layout Standard
 
-Again, variations of these cases may 
-\emph on 
-not
-\emph default 
- be recognized.
- They are standard C expressions, so I heartily recommend these be the only
- way to get the higher order byte/word, (it is portable).
- Of course it will be recognized even if it is embedded in other expressions,
- e.g.:
-\layout Verse
 
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-xyz = gint + ((gint >> 8) & 0xFF);
 \layout Standard
 
-will still be recognized.
-\layout Subsection
 
-Peephole Optimizer
-\begin_inset LatexCommand \label{sub:Peephole-Optimizer}
+\size footnotesize 
+Less than
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
 
+\size footnotesize 
+IC_RESULT = IC_LEFT < IC_RIGHT;
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \index{Peephole optimizer}
 
+\size footnotesize 
+'>'
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \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\SpecialChar ~
-@\SpecialChar ~
-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
+
+\size footnotesize 
+Greater than 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\size footnotesize 
+IC_RESULT = IC_LEFT > IC_RIGHT;
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
--peep-file
-\begin_inset LatexCommand \index{-\/-peep-file}
+\layout Standard
 
+
+\size footnotesize 
+EQ_OP
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- <filename>
-\emph default 
- option.
- The rule language is best illustrated with examples.
-\layout Verse
+\layout Standard
 
 
-\family typewriter 
-replace { 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-mov %1,a 
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-mov a,%1
-\newline 
-} by {
-\newline 
-\SpecialChar ~
-\SpecialChar ~
-mov %1,a
-\newline 
-}
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+Equal to 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
-The above rule will change the following assembly
-\begin_inset LatexCommand \index{Assembler routines}
 
+\size footnotesize 
+IC_RESULT = IC_LEFT == IC_RIGHT;
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- sequence:
-\layout Verse
+\layout Standard
 
 
-\family typewriter 
-mov r1,a 
-\newline 
-mov a,r1
+\size footnotesize 
+AND_OP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
-to
-\layout Verse
 
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT() 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\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
 
+\size footnotesize 
+Logical and operation
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\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
+\size footnotesize 
+IC_RESULT = IC_LEFT && IC_RIGHT; 
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\size footnotesize 
+OR_OP
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
--peep-file option
-\emph default 
-).
- E.g.
- some variants of the 8051 MCU
-\begin_inset LatexCommand \index{MCS51 variants}
 
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT() 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- 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
+\layout Standard
 
 
-\family typewriter 
-replace { lcall %1 } by { acall %1 } 
-\newline 
-replace { ljmp %1 } by { ajmp %1 }
+\size footnotesize 
+Logical or operation 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
+
+\size footnotesize 
+IC_RESULT = IC_LEFT || IC_RIGHT; 
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
 \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
 
+\size footnotesize 
+'^'
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\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
 
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT() 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\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 innermost 'pop' 'push' pair would
- be eliminated, i.e.:
-\layout Verse
 
+\size footnotesize 
+Exclusive OR
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-pop ar1 
-\newline 
-pop ar2 
-\newline 
-push ar2 
-\newline 
-push ar1
 \layout Standard
 
-would result in:
-\layout Verse
 
+\size footnotesize 
+IC_RESULT = IC_LEFT ^ IC_RIGHT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-pop ar1 
-\newline 
-; nop 
-\newline 
-push ar1
 \layout Standard
 
 
-\emph on 
-with
-\emph defaul
- 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
+\size footnotesize 
+'|'
+\end_inse
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT() 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\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
 
+\size footnotesize 
+Bitwise OR 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\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 
-.
+
+\size footnotesize 
+IC_RESULT = IC_LEFT | IC_RIGHT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
 \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
+
+\size footnotesize 
+BITWISEAND
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
--peep-file option.
-\layout Section
+\layout Standard
 
-ANSI-Compliance
-\begin_inset LatexCommand \index{ANSI-compliance}
 
+\size footnotesize 
+Bitwise AND 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\begin_inset LatexCommand \label{sub:ANSI-Compliance}
 
+\size footnotesize 
+IC_RESULT = IC_LEFT & IC_RIGHT;
 \end_inset 
-
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-The latest publically available version of the standard 
-\emph on 
-ISO/IEC 9899 - Programming languages - C
-\emph default 
- should be available at: 
-\begin_inset LatexCommand \url{http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899}
 
+\size footnotesize 
+LEFT_OP
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-.
-\newline 
+\layout Standard
+
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-Deviations from the compliance:
-\layout Itemize
 
-functions are not reentrant
-\begin_inset LatexCommand \index{reentrant}
+\size footnotesize 
+Left shift 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
+
+\size footnotesize 
+IC_RESULT = IC_LEFT << IC_RIGHT 
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- unless explicitly declared as such or the 
-\series bold 
--
-\begin_inset ERT
-status Collapsed
+\layout Standard
+
+
+\size footnotesize 
+RIGHT_OP
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\size footnotesize 
+IC_LEFT() IC_RIGHT() IC_RESULT()
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
--stack-auto
-\begin_inset LatexCommand \index{-\/-stack-auto}
+\layout Standard
 
+
+\size footnotesize 
+Right shift
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
 
-\series default 
- command line option is specified.
-\layout Itemize
+\size footnotesize 
+IC_RESULT = IC_LEFT >> IC_RIGHT 
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-structures
-\begin_inset LatexCommand \index{struct}
+\layout Standard
 
+
+\size footnotesize 
+GET_VALUE_
+\newline 
+AT_ ADDRESS
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
- and unions
-\begin_inset LatexCommand \index{union}
 
+\size footnotesize 
+IC_LEFT() IC_RESULT()
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- cannot be assigned values directly, cannot be passed as function parameters
- or assigned to each other and cannot be a return value
-\begin_inset LatexCommand \index{return value}
+\layout Standard
 
+
+\size footnotesize 
+Indirect fetch 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
- from a function, e.g.:
-\begin_deeper 
-\layout Verse
+\layout Standard
 
 
-\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 
+\size footnotesize 
+IC_RESULT = (*IC_LEFT);
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\series bold 
-struct
-\series default 
- s foo1 (
-\series bold 
-struct
-\series default 
- 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
+\layout Standard
 
-initialization of structure arrays must be fully braced.
-\begin_deeper 
-\layout Verse
 
+\size footnotesize 
+POINTER_SET
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\family typewriter 
-struct s { char x } a[] = {1, 2};\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-\SpecialChar ~
-/* invalid in SDCC */
-\newline 
-struct s { char x } a[] = {{1}, {2}}; /* OK */
-\end_deeper 
-\layout Itemize
+\layout Standard
 
-'long long
-\begin_inset LatexCommand \index{long long (not supported)}
 
+\size footnotesize 
+IC_RIGHT() IC_RESULT() 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
-' (64 bit integers
-\begin_inset LatexCommand \index{int (64 bit) (not supported)}
 
+\size footnotesize 
+Indirect set
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-) not supported.
-\layout Itemize
+\layout Standard
 
-'double
-\begin_inset LatexCommand \index{double (not supported)}
 
-\end_inset 
+\size footnotesize 
+(*IC_RESULT) = IC_RIGHT;
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
-' precision floating point 
-\begin_inset LatexCommand \index{Floating point support}
 
+\size footnotesize 
+'='
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-not supported.
-\layout Itemize
+\layout Standard
 
-Old K&R style
-\begin_inset LatexCommand \index{K\&R style}
 
+\size footnotesize 
+IC_RIGHT() IC_RESULT()
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
- function declarations are NOT allowed.
-\begin_deeper 
-\layout Verse
-
+\layout Standard
 
-\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
 
-Most enhancements in C99 are not supported, f.e.:
-\begin_deeper 
-\layout Verse
+\size footnotesize 
+Assignment
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\family typewriter 
-\series bold 
-inline
-\begin_inset LatexCommand \index{inline (not supported)}
 
+\size footnotesize 
+IC_RESULT = IC_RIGHT;
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\series default 
- int increment (int a) { return a+1; } /* is invalid in SDCC although allowed
- in C99.
- An empty define 
-\emph on 
-#define inline
-\emph default 
- can be used as a work around */
-\newline 
-
-\newline 
-for (
-\series bold 
-int
-\series default 
- i=0; i<10; i++) /* is invalid in SDCC although allowed in C99 */
-\end_deeper 
-\layout Itemize
 
-Certain words that are valid identifiers in the standard may be reserved
- words in SDCC unless the 
-\series bold 
--
-\begin_inset ERT
-status Collapsed
+\size footnotesize 
+IFX
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
-
--std-c89
-\begin_inset LatexCommand \index{-\/-std-c89}
 
+\size footnotesize 
+IC_COND IC_TRUE IC_LABEL
 \end_inset 
-
- or -
-\begin_inset ERT
-status Collapsed
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
+
+\size footnotesize 
+Conditional jump.
+ If true label is present then jump to true label if condition is true else
+ jump to false label if condition is false 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
--std-c99
-\begin_inset LatexCommand \index{-\/-std-c99}
 
+\size footnotesize 
+if (IC_COND) goto IC_TRUE; 
+\newline 
+\SpecialChar ~
+\SpecialChar ~
+Or 
+\newline 
+If (!IC_COND) goto IC_FALSE;
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\series default 
- command line options are used.
- These may include (depending on the selected processor): 'at', 'banked',
- 'bit', 'code', 'critical', 'data', 'eeprom', 'far', 'flash', 'idata', 'interrup
-t', 'near', 'nonbanked', 'pdata', 'reentrant', 'sbit', 'sfr', 'shadowregs',
- 'sram', 'using', 'wparam', 'xdata', '_overlay', '_asm', '_endasm', and
- '_naked'.
- Compliant equivalents of these keywords are always available in a form
- that begin with two underscores
-\begin_inset LatexCommand \index{\_\_ (prefix for extended keywords)}
 
+\size footnotesize 
+ADDRESS_OF
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-, f.e.
- '__data' instead of 'data'.
-\layout Section
+\layout Standard
 
-Cyclomatic Complexity
-\begin_inset LatexCommand \index{Cyclomatic complexity}
 
+\size footnotesize 
+IC_LEFT() IC_RESULT()
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \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:
-\newline 
+\size footnotesize 
+Address of 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \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
+\size footnotesize 
+IC_RESULT = &IC_LEFT();
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-Retargetting for other Processors
 \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
+\size footnotesize 
+JUMPTABLE
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-\backslash 
-/
-\end_inset 
 
--dumpraw option.
-\layout Itemize
+\size footnotesize 
+IC_JTCOND IC_JTLABELS
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-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
 
-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}
+\size footnotesize 
+Jump to list of labels depending on the value of JTCOND
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-\end_inset 
+\layout Standard
 
- 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 
+\size footnotesize 
+Switch statement
+\end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-\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 
+\layout Standard
 
-\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
 
-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
+\size footnotesize 
+CAST
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-As mentioned in the optimization section the peep-hole optimizer is rule
- based system, which can reprogrammed for other MCUs.
-\layout Chapter
+\layout Standard
 
-Compiler internals
-\begin_inset LatexCommand \index{Compiler internals}
 
+\size footnotesize 
+IC_RIGHT() IC_LEFT() IC_RESULT()
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
+\layout Standard
 
-\layout Section
 
-The anatomy of the compiler
-\begin_inset LatexCommand \label{sub:The-anatomy-of}
+\size footnotesize 
+Cast types 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
+
 
+\size footnotesize 
+IC_RESULT = (typeof IC_LEFT) IC_RIGHT;
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
 
+\size footnotesize 
+SEND
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
 \layout Standard
 
 
-\shape italic 
-This is an excerpt from an article published in Circuit Cellar Magazine
- in 
-\series bold 
-August 2000
-\series default 
-.
- It's a little outdated (the compiler is much more efficient now and user/develo
-per friendly), but pretty well exposes the guts of it all.
-\shape default 
+\size footnotesize 
+IC_LEFT()
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
-\newline 
 
+\size footnotesize 
+This is used for passing parameters in registers; 
 \newline 
-The current version of SDCC can generate code for Intel 8051 and Z80 MCU.
- It is fairly easy to retarget for other 8-bit MCU.
- Here we take a look at some of the internals of the compiler.
-\layout Paragraph*
+move IC_LEFT to the next available parameter register.
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
-Parsing
-\begin_inset LatexCommand \index{Parsing}
 
+\size footnotesize 
+None
 \end_inset 
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-Parsing the input source file and creating an AST (Annotated Syntax Tree
-\begin_inset LatexCommand \index{Annotated syntax tree}
 
+\size footnotesize 
+RECV
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
-).
- This phase also involves propagating types (annotating each node of the
- parse tree with type information) and semantic analysis.
- There are some MCU specific parsing rules.
- For example the storage classes, the extended storage classes are MCU specific
- while there may be a xdata storage class for 8051 there is no such storage
- class for z80 or Atmel AVR.
- SDCC allows MCU specific storage class extensions, i.e.
- xdata will be treated as a storage class specifier when parsing 8051 C
- code but will be treated as a C identifier when parsing z80 or ATMEL AVR
- C code.
-\layout Paragraph*
+\layout Standard
 
-Generating iCode
-\begin_inset LatexCommand \index{iCode}
 
+\size footnotesize 
+IC_RESULT()
 \end_inset 
-
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-Intermediate code generation.
- In this phase the AST is broken down into three-operand form (iCode).
- These three operand forms are represented as doubly linked lists.
- ICode is the term given to the intermediate form generated by the compiler.
- ICode example section shows some examples of iCode generated for some simple
- C source functions.
-\layout Paragraph*
-
-Optimizations
-\begin_inset LatexCommand \index{Optimizations}
 
+\size footnotesize 
+This is used for receiving parameters passed in registers;
+\newline 
+Move the values in the next parameter register to IC_RESULT 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
-.
 \layout Standard
 
-Bulk of the target independent optimizations is performed in this phase.
- The optimizations include constant propagation, common sub-expression eliminati
-on, loop invariant code movement, strength reduction of loop induction variables
- and dead-code elimination.
-\layout Paragraph*
-
-Live range analysis
-\begin_inset LatexCommand \index{Live range analysis}
 
+\size footnotesize 
+None
 \end_inset 
-
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-During intermediate code generation phase, the compiler assumes the target
- machine has infinite number of registers and generates a lot of temporary
- variables.
- The live range computation determines the lifetime of each of these compiler-ge
-nerated temporaries.
- A picture speaks a thousand words.
- ICode example sections show the live range annotations for each of the
- operand.
- It is important to note here, each iCode is assigned a number in the order
- of its execution in the function.
- The live ranges are computed in terms of these numbers.
- The from number is the number of the iCode which first defines the operand
- and the to number signifies the iCode which uses this operand last.
-\layout Paragraph*
 
-Register Allocation
-\begin_inset LatexCommand \index{Register allocation}
+\shape slanted 
+\size footnotesize 
+(some more have been added)
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
 \end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\layout Standard
 
+\end_inset 
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
 
 \layout Standard
 
-The register allocation determines the type and number of registers needed
- by each operand.
- In most MCUs only a few registers can be used for indirect addressing.
- In case of 8051 for example the registers R0 & R1 can be used to indirectly
- address the internal ram and DPTR to indirectly address the external ram.
- The compiler will try to allocate the appropriate register to pointer variables
- if it can.
- ICode example section shows the operands annotated with the registers assigned
- to them.
- The compiler will try to keep operands in registers as much as possible;
- there are several schemes the compiler uses to do achieve this.
- When the compiler runs out of registers the compiler will check to see
- if there are any live operands which is not used or defined in the current
- basic block being processed, if there are any found then it will push that
- operand and use the registers in this block, the operand will then be popped
- at the end of the basic block.
+
+\shape slanted 
+\size footnotesize 
+see f.e.
  
-\layout Standard
+\family typewriter 
+gen51Code()
+\family default 
+ in 
+\family typewriter 
+src/mcs51/gen.c
+\end_inset 
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset 
 
-There are other MCU specific considerations in this phase.
- Some MCUs have an accumulator; very short-lived operands could be assigned
- to the accumulator instead of a general-purpose register.
-\layout Paragraph*
 
-Code generation
 \layout Standard
 
-Figure II gives a table of iCode operations supported by the compiler.
- The code generation involves translating these operations into corresponding
- assembly code for the processor.
- This sounds overly simple but that is the essence of code generation.
- Some of the iCode operations are generated on a MCU specific manner for
- example, the z80 port does not use registers to pass parameters so the
- SEND and RECV iCode operations will not be generated, and it also does
- not support JUMPTABLES.
-\newline 
 
-\series bold 
-\shape italic 
-\color red
-<Where is Figure II?>
-\layout Comment
+\begin_inset Note
+collapsed true
+
+\layout Standard
 
 In the original article Figure II was announced to be downloadable on 
 \shape italic 
 Circuit Cellar
 \shape default 
 's web site.
- Unfortunately it never seemed to have shown up there, so: where is Figure
- II?
+ ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2000/121/dutta.ZIP
+\end_inset 
+
+
 \layout Paragraph*
 
 ICode Example