diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /doc | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/INSTALL.txt | 90 | ||||
| -rw-r--r-- | doc/MCS51_named.svg | 275 | ||||
| -rw-r--r-- | doc/Makefile | 116 | ||||
| -rw-r--r-- | doc/Makefile.in | 116 | ||||
| -rw-r--r-- | doc/README.txt | 125 | ||||
| -rw-r--r-- | doc/clean.mk | 21 | ||||
| -rw-r--r-- | doc/sdccman.lyx | 73320 |
7 files changed, 74063 insertions, 0 deletions
diff --git a/doc/INSTALL.txt b/doc/INSTALL.txt new file mode 100644 index 0000000..c09707d --- /dev/null +++ b/doc/INSTALL.txt @@ -0,0 +1,90 @@ +SDCC Binary Kit Install Help +---------------------------- + +For Linux users: +================ +To install: + +* Extract the binary kit to a temporary directory. + This will create a new directory called 'sdcc-3.9.0' in the temporary directory. + cd ~ + mkdir tmp + cd tmp + tar xjf path/to/binary/kit/sdcc-3.9.0-i386-unknown-linux2.5.tar.bz2 + +* Change to the sdcc directory and copy all files to /usr/local + cd sdcc-3.9.0 + cp -r * /usr/local + +This will install sdcc binaries into: /usr/local/bin/ +header files into: /usr/local/share/sdcc/include/ +non-free header files into: /usr/local/share/sdcc/non-free/include/ +library files into: /usr/local/share/sdcc/lib/ +non-free library files into: /usr/local/share/sdcc/non-free/lib/ +and documentation into: /usr/local/share/sdcc/doc/ + +You can test the install by entering: + /usr/local/bin/sdcc -v + +This should return sdcc's version number. + +Even if the default search paths look into /usr/local, sdcc is fully +relocatable. Try `sdcc --print-search-dirs` if you have problems with header +or library files. See sdccman.pdf for more detailed information. + + +For Windows 9X/NT/2000/XP/Vista/7/8 users: +========================================== +To install: + +* If you would like to keep a copy of your previous version, + rename the directory where it's installed first +* Run sdcc-3.9.0-setup.exe for 32 bit Windows or + Run sdcc-3.9.0-x64-setup.exe for 64 bit Windows + +By default this will install sdcc binaries into: C:\Program Files\SDCC\bin\ +header files into: C:\Program Files\SDCC\include\ +non-free header files into: C:\Program Files\SDCC\non-free\include\ +library files into: C:\Program Files\SDCC\lib\ +non-free library files into: C:\Program Files\SDCC\non-free\lib\ +and documentation into: C:\Program Files\SDCC\doc\ + +You can test the install by opening a DOS box and entering: + sdcc -v + +This should return sdcc's version number. + +sdcc for windows is fully relocatable. Try `sdcc --print-search-dirs` if you +have problems with header or library files. See sdccman.pdf for more +detailed information. + + +For Mac OS X users: +=================== +To install: + +* Extract the binary kit to a temporary directory. + This will create a new directory called 'sdcc-3.9.0' in the temporary directory. + cd ~ + mkdir tmp + cd tmp + tar xjf path/to/binary/kit/sdcc-3.9.0-universal-apple-macosx.tar.bz2 + +* Change to the sdcc directory and copy all files to /Developer/sdcc + cp -r sdcc /Developer/sdcc + +This will install sdcc binaries into: /Developer/sdcc/bin/ +header files into: /Developer/sdcc/share/sdcc/include/ +non-free header files into: /Developer/sdcc/share/sdcc/non-free/include/ +library files into: /Developer/sdcc/share/sdcc/lib/ +non-free library files into: /Developer/sdcc/share/sdcc/non-free/lib/ +and documentation into: /Developer/sdcc/share/sdcc/doc/ + +You can test the install by entering: + /Developer/sdcc/bin/sdcc -v + +This should return sdcc's version number. + +Even if the default search paths look into /usr/local, sdcc is fully +relocatable. Try `sdcc --print-search-dirs` if you have problems with header +or library files. See sdccman.pdf for more detailed information. diff --git a/doc/MCS51_named.svg b/doc/MCS51_named.svg new file mode 100644 index 0000000..f4d3a96 --- /dev/null +++ b/doc/MCS51_named.svg @@ -0,0 +1,275 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="336.61417" + height="177.16534" + id="svg2" + version="1.1" + inkscape:version="0.48.5 r10040" + sodipodi:docname="MCS51_named.svg"> + <defs + id="defs4" /> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.979899" + inkscape:cx="254.90698" + inkscape:cy="84.470923" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="true" + units="mm" + inkscape:window-width="1600" + inkscape:window-height="847" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1"> + <inkscape:grid + type="xygrid" + id="grid2985" + empspacing="5" + visible="true" + enabled="true" + snapvisiblegridlinesonly="true" + units="mm" + spacingx="1mm" + spacingy="1mm" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Ebene 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(0,-875.19683)"> + <text + xml:space="preserve" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:cmr10;-inkscape-font-specification:cmr10" + x="-155.05843" + y="92.817604" + id="text2987" + sodipodi:linespacing="125%" + transform="translate(0,875.19684)"><tspan + sodipodi:role="line" + id="tspan2989" + x="-155.05843" + y="92.817604" /></text> + <text + xml:space="preserve" + style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:cmmi10;-inkscape-font-specification:cmmi10" + x="-47.142857" + y="157.16534" + id="text2991" + sodipodi:linespacing="125%" + transform="translate(0,875.19684)"><tspan + sodipodi:role="line" + id="tspan2993" + x="-47.142857" + y="157.16534" /></text> + <text + xml:space="preserve" + style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Aboriginal Serif;-inkscape-font-specification:Aboriginal Serif" + x="-96.785713" + y="144.84392" + id="text2995" + sodipodi:linespacing="125%" + transform="translate(0,875.19684)"><tspan + sodipodi:role="line" + id="tspan2997" + x="-96.785713" + y="144.84392" /></text> + <text + xml:space="preserve" + style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:cmr10;-inkscape-font-specification:cmr10" + x="-70.535713" + y="126.62963" + id="text2999" + sodipodi:linespacing="125%" + transform="translate(0,875.19684)"><tspan + sodipodi:role="line" + id="tspan3001" + x="-70.535713" + y="126.62963" /></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="35.433071" + y="910.62988" + id="text3003" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3005" + x="35.433071" + y="910.62988">__idata</tspan></text> + <text + xml:space="preserve" + style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:FreeSerif;-inkscape-font-specification:FreeSerif" + x="-77.14286" + y="158.95107" + id="text3007" + sodipodi:linespacing="125%" + transform="translate(0,875.19684)"><tspan + sodipodi:role="line" + id="tspan3009" + x="-77.14286" + y="158.95107" /></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="35.433071" + y="963.77948" + id="text3011" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3013" + x="35.433071" + y="963.77948">__data</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="141.73228" + y="910.62988" + id="text3015" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3017" + x="141.73228" + y="910.62988">__xdata</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="141.73228" + y="963.77948" + id="text3019" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3021" + x="141.73228" + y="963.77948">__pdata</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="248.03149" + y="910.62988" + id="text3023" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3025" + x="248.03149" + y="910.62988">__code</tspan></text> + <rect + style="fill:none;stroke:#000000;stroke-width:0.67322832;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3027" + width="88.58268" + height="141.73228" + x="17.716536" + y="892.91339" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.67322832;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3027-8" + width="88.58268" + height="141.73228" + x="124.01575" + y="892.91339" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.67322832;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3027-0" + width="88.58268" + height="141.73228" + x="230.31497" + y="892.91339" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.67322832;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3054" + width="74.409454" + height="81.496063" + x="24.80315" + y="70.866135" + transform="translate(0,875.19684)" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.67322832;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" + id="rect3056" + width="74.409454" + height="81.496063" + x="131.10236" + y="70.866135" + transform="translate(0,875.19684)" /> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="35.433071" + y="981.49603" + id="text3153" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3155" + x="35.433071" + y="981.49603">128B</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="35.433071" + y="928.34644" + id="text3157" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3159" + x="35.433071" + y="928.34644">256B</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="141.73228" + y="981.49603" + id="text3161" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3163" + x="141.73228" + y="981.49603">256B</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="141.73228" + y="928.34644" + id="text3165" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3167" + x="141.73228" + y="928.34644">64KB</tspan></text> + <text + xml:space="preserve" + style="font-size:16px;font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Century Schoolbook L;-inkscape-font-specification:Century Schoolbook L Medium" + x="248.03149" + y="928.34644" + id="text3169" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan3171" + x="248.03149" + y="928.34644">64KB</tspan></text> + </g> +</svg> diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..0cf943d --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,116 @@ + +srcdir = . + +LYX = lyx +LATEX = latex +LATEX2HTML = : +PDFLATEX = pdflatex +MAKEINDEX = makeindex +DVIPDFM = dvipdfm + +PDFLATEXARGS = -file-line-error -halt-on-error + +include ../Makefile.common + +MANUAL = sdccman + +all: $(MANUAL).pdf $(MANUAL).html/index.html $(MANUAL).txt + +install: + $(INSTALL) -d $(DESTDIR)$(docdir) + cp -rf $(srcdir)/*.txt $(DESTDIR)$(docdir) + txtfiles=`echo *.txt | grep -v '\*\.txt' || true` + if [ $(txtfiles) ]; then cp $(txtfiles) $(DESTDIR)$(docdir); fi + if [ -f $(MANUAL).html/index.html ]; then cp -rf $(MANUAL).html $(DESTDIR)$(docdir); fi + if [ -f $(MANUAL).pdf ]; then cp -rf $(MANUAL).pdf $(DESTDIR)$(docdir); fi + rm -rf `find $(DESTDIR)$(docdir) -name .svn -type d` + rm -f $(DESTDIR)$(docdir)/*/images.* + +uninstall: + rm -rf $(DESTDIR)$(docdir) + +$(MANUAL).html/index.html: $(MANUAL).tex $(MANUAL).aux ;#$(MANUAL).ind $(MANUAL).glo + mkdir -p $(dir $@) + @# fixes $(LATEX2HTML) problems with two consecutive dashes for long-options: --stack-auto + @# fixes $(LATEX2HTML) problems with \tabularnewline + sed -e 's,-\\/-,-\\/-\\/-,g' \ + -e 's,\\tabularnewline$$,\\\\,g' < $< > $(dir $@)$(notdir $<) + cp $(MANUAL).aux $(dir $@) + -cd $(dir $@); $(LATEX2HTML) -split 5 -show_section_numbers -local_icons -info "" -nosubdir $(MANUAL) $(QUIET) + rm -f $(dir $@)WARNINGS $(dir $@)labels.pl $(dir $@)$(notdir $<) $(dir $@)$*.aux + +%.html/index.html: %.tex %.aux + mkdir -p $(dir $@) + @# fixes $(LATEX2HTML) problems with two consecutive dashes for long-options: --stack-auto + @# fixes $(LATEX2HTML) problems with \tabularnewline + sed -e 's,-\\/-,-\\/-\\/-,g' \ + -e 's,\\tabularnewline$$,\\\\,g' < $< > $(dir $@)$(notdir $<) + cp $*.aux $(dir $@) + -cd $(dir $@); $(LATEX2HTML) -split 0 -local_icons -info "" -nosubdir $* $(QUIET) + rm -f $(dir $@)WARNINGS $(dir $@)labels.pl $(dir $@)$(notdir $<) $(dir $@)$*.aux + +%.txt: %.lyx + @# $(LYX) will export the file in the directory of the $(LYX) file + @# if VPATH is used the $(LYX) file is copied first + if [ "$(srcdir)" != "." ]; then \ + cp -f $(srcdir)/$(notdir $<) $(srcdir)/*.svg . ; \ + fi + $(LYX) -e text $(notdir $<); + +%.pdf %.aux: %.tex %.dvi %.ind + which $(PDFLATEX) > /dev/null && $(PDFLATEX) $* || $(DVIPDFM) $* + +#%.ps: %.pdf +# $(DVIPS) $* + +%.dvi: %.tex + $(LATEX) $< + @# rerun to in include aux + $(LATEX) $< + +%.tex: %.lyx + if [ "$(srcdir)" != "." ] ; then \ + cp -f $(srcdir)/$(notdir $^) $(srcdir)/*.svg . ; \ + fi + echo $(VERSION) > sdcc_version + $(LYX) -e latex $(notdir $<); + +%.ind: %.dvi + $(LATEX) $* + # is there an index? + if [ -f $*.idx ] ; then \ + $(MAKEINDEX) -q $*; \ + $(LATEX) $*; \ + $(LATEX) $*; \ + fi +# -$(MAKEINDEX) -s l2hidx.ist $*; \ + +#%.glo: %.dvi +# # the glossary, not implemented yet +# # $(MAKEINDEX) -s l2hglo.ist -o $@ $< + +#%.pdf %.aux: %.tex +# $(PDFLATEX) $* $(PDFLATEXARGS) +# [ ! -e "$*.idx" ] || $(MAKEINDEX) $* $(QUIET) +# $(PDFLATEX) $* $(PDFLATEXARGS) +# [ ! -e "$*.idx" ] || $(MAKEINDEX) $* $(QUIET) +# $(PDFLATEX) $* $(PDFLATEXARGS) + +archive: all + rm -rf sdcc-doc sdcc-doc.tar.bz2 + mkdir sdcc-doc + rsync -rCt *.pdf *.txt $(srcdir)/*.txt sdcc-doc + + for doc in $(MANUAL); do \ + rsync -Rt $$doc.html/*.html $$doc.html/*.png $$doc.html/*.css sdcc-doc/; \ + done + + mkdir sdcc-doc/as + rsync -rCt $(top_srcdir)/sdas/doc/* sdcc-doc/as/ + + mkdir sdcc-doc/ucsim + cd $(top_srcdir)/sim/ucsim/doc; rsync *.html *.jpg *.fig ../../../doc/sdcc-doc/ucsim/ + + tar -c sdcc-doc | bzip2 -9 > sdcc-doc.tar.bz2 + +include $(srcdir)/clean.mk diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..7ae6210 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,116 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ + +LYX = @LYX@ +LATEX = @LATEX@ +LATEX2HTML = @LATEX2HTML@ +PDFLATEX = @PDFLATEX@ +MAKEINDEX = @MAKEINDEX@ +DVIPDFM = @DVIPDFM@ + +PDFLATEXARGS = -file-line-error -halt-on-error + +include ../Makefile.common + +MANUAL = sdccman + +all: $(MANUAL).pdf $(MANUAL).html/index.html $(MANUAL).txt + +install: + $(INSTALL) -d $(DESTDIR)$(docdir) + cp -rf $(srcdir)/*.txt $(DESTDIR)$(docdir) + txtfiles=`echo *.txt | grep -v '\*\.txt' || true` + if [ $(txtfiles) ]; then cp $(txtfiles) $(DESTDIR)$(docdir); fi + if [ -f $(MANUAL).html/index.html ]; then cp -rf $(MANUAL).html $(DESTDIR)$(docdir); fi + if [ -f $(MANUAL).pdf ]; then cp -rf $(MANUAL).pdf $(DESTDIR)$(docdir); fi + rm -rf `find $(DESTDIR)$(docdir) -name .svn -type d` + rm -f $(DESTDIR)$(docdir)/*/images.* + +uninstall: + rm -rf $(DESTDIR)$(docdir) + +$(MANUAL).html/index.html: $(MANUAL).tex $(MANUAL).aux ;#$(MANUAL).ind $(MANUAL).glo + mkdir -p $(dir $@) + @# fixes $(LATEX2HTML) problems with two consecutive dashes for long-options: --stack-auto + @# fixes $(LATEX2HTML) problems with \tabularnewline + sed -e 's,-\\/-,-\\/-\\/-,g' \ + -e 's,\\tabularnewline$$,\\\\,g' < $< > $(dir $@)$(notdir $<) + cp $(MANUAL).aux $(dir $@) + -cd $(dir $@); $(LATEX2HTML) -split 5 -show_section_numbers -local_icons -info "" -nosubdir $(MANUAL) $(QUIET) + rm -f $(dir $@)WARNINGS $(dir $@)labels.pl $(dir $@)$(notdir $<) $(dir $@)$*.aux + +%.html/index.html: %.tex %.aux + mkdir -p $(dir $@) + @# fixes $(LATEX2HTML) problems with two consecutive dashes for long-options: --stack-auto + @# fixes $(LATEX2HTML) problems with \tabularnewline + sed -e 's,-\\/-,-\\/-\\/-,g' \ + -e 's,\\tabularnewline$$,\\\\,g' < $< > $(dir $@)$(notdir $<) + cp $*.aux $(dir $@) + -cd $(dir $@); $(LATEX2HTML) -split 0 -local_icons -info "" -nosubdir $* $(QUIET) + rm -f $(dir $@)WARNINGS $(dir $@)labels.pl $(dir $@)$(notdir $<) $(dir $@)$*.aux + +%.txt: %.lyx + @# $(LYX) will export the file in the directory of the $(LYX) file + @# if VPATH is used the $(LYX) file is copied first + if [ "$(srcdir)" != "." ]; then \ + cp -f $(srcdir)/$(notdir $<) $(srcdir)/*.svg . ; \ + fi + $(LYX) -e text $(notdir $<); + +%.pdf %.aux: %.tex %.dvi %.ind + which $(PDFLATEX) > /dev/null && $(PDFLATEX) $* || $(DVIPDFM) $* + +#%.ps: %.pdf +# $(DVIPS) $* + +%.dvi: %.tex + $(LATEX) $< + @# rerun to in include aux + $(LATEX) $< + +%.tex: %.lyx + if [ "$(srcdir)" != "." ] ; then \ + cp -f $(srcdir)/$(notdir $^) $(srcdir)/*.svg . ; \ + fi + echo $(VERSION) > sdcc_version + $(LYX) -e latex $(notdir $<); + +%.ind: %.dvi + $(LATEX) $* + # is there an index? + if [ -f $*.idx ] ; then \ + $(MAKEINDEX) -q $*; \ + $(LATEX) $*; \ + $(LATEX) $*; \ + fi +# -$(MAKEINDEX) -s l2hidx.ist $*; \ + +#%.glo: %.dvi +# # the glossary, not implemented yet +# # $(MAKEINDEX) -s l2hglo.ist -o $@ $< + +#%.pdf %.aux: %.tex +# $(PDFLATEX) $* $(PDFLATEXARGS) +# [ ! -e "$*.idx" ] || $(MAKEINDEX) $* $(QUIET) +# $(PDFLATEX) $* $(PDFLATEXARGS) +# [ ! -e "$*.idx" ] || $(MAKEINDEX) $* $(QUIET) +# $(PDFLATEX) $* $(PDFLATEXARGS) + +archive: all + rm -rf sdcc-doc sdcc-doc.tar.bz2 + mkdir sdcc-doc + rsync -rCt *.pdf *.txt $(srcdir)/*.txt sdcc-doc + + for doc in $(MANUAL); do \ + rsync -Rt $$doc.html/*.html $$doc.html/*.png $$doc.html/*.css sdcc-doc/; \ + done + + mkdir sdcc-doc/as + rsync -rCt $(top_srcdir)/sdas/doc/* sdcc-doc/as/ + + mkdir sdcc-doc/ucsim + cd $(top_srcdir)/sim/ucsim/doc; rsync *.html *.jpg *.fig ../../../doc/sdcc-doc/ucsim/ + + tar -c sdcc-doc | bzip2 -9 > sdcc-doc.tar.bz2 + +include $(srcdir)/clean.mk diff --git a/doc/README.txt b/doc/README.txt new file mode 100644 index 0000000..88f8c98 --- /dev/null +++ b/doc/README.txt @@ -0,0 +1,125 @@ +SDCC - free open source, retargettable, optimizing ANSI-C compiler +------------------------------------------------------------------ + +Welcome to SDCC, free open source, retargettable, optimizing ANSI C +compiler suite that targets a growing list of processors including the +Intel MCS-51 based microprocessors (8031, 8032, 8051, 8052, etc.), Maxim +(formerly Dallas) DS80C390 variants, Freescale (formerly Motorola) HC08 +based (hc08, s08), Zilog Z80 based MCUs (Z80, Z180, Game Boy, Rabbit +2000/3000, Rabbit 3000A, TLCS-90) and STMicroelectronics STM8. +Work is in progress on supporting the Microchip PIC16 and PIC18 targets. +It can be retargeted for other microprocessors. + +See share/sdcc/doc/INSTALL.txt for the installation instructions for +the binary kits. + +See the share/sdcc/doc directory for more documentation. + +See http://sdcc.sourceforge.net/ for the latest information on sdcc. + + +Licenses: +~~~~~~~~~ +SDCC compiler suite is a collection of several components derived from +different sources with different FOSS licenses. See the sdccman.pdf +document, chapter "SDCC Suite Licenses" for details. + +The code or object files generated by SDCC suite are not licensed, so +they can be used in FLOSS or proprietary (closed source) applications. + +The great majority of sdcc run-time libraries are licensed under the +GPLv2+LE which allows linking of sdcc run time libraries with +proprietary (closed source) applications. + +Exception are pic device libraries and header files which are derived +from Microchip header (.inc) and linker script (.lkr) files. Microchip +requires that "The header files should state that they are only to be +used with authentic Microchip devices" which makes them incompatible +with the GPL. Pic device libraries and header files are located at +non-free/lib and non-free/include directories respectively. Sdcc should +be run with the --use-non-free command line option in order to include +non-free header files and libraries. + +See: + + http://www.gnu.org/copyleft/gpl.html + + http://sourceforge.net/apps/trac/sdcc/wiki/SDCC%20Library%20Licenses + + +Support: +~~~~~~~~ +SDCC compiler suite is a collaborative effort between a group of +volunteers. Please feel free to report bugs via the Sourceforge bug +tracker, or to ask questions on the user mailing list. See: + + http://sourceforge.net/tracker/?atid=100599&group_id=599&func=browse + + http://sourceforge.net/mail/?group_id=599 + +Notes: +* The ds400, pic14 and pic16 are currently experimental, but work is in +progress. Please check http://sdcc.sourceforge.net/snap.php for snapshots. +* The TININative, avr and xa51 targets are no longer maintained. + + +Roadmap: +~~~~~~~~ +COPYING - GPL v2 +debugger/ - sdcdb debugger +device/ - Device libraries and examples +doc/ - sdcc and target specific documentation +sdas/ - Assemblers and linkers, derived from asxxxx +sim/ - ucsim simulator +src/ - Source to the C compiler and targets +support/ - Libraries and apps that may not be provided by your system. + + +Authors and interested persons: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Sandeep Dutta (sandeep AT users.sourceforge.net) + +* Jean Loius-VERN <jlvern AT writeme.com> +* Daniel Drotos <drdani AT mazsola.iit.uni-miskolc.hu> +* Kevin Vigor <kevin AT vigor.nu> +* Johan Knol <johan.knol AT iduna.nl> +* Scott Dattalo <scott AT dattalo.com> +* Karl Bongers <karl AT turbobit.com> +* Bernhard Held <bernhard AT bernhardheld.de> +* Frieder Ferlemann <frieder.ferlemann AT web.de> +* Jesus Calvino-Fraga <jesusc AT ece.ubc.ca> +* Borut Razem <borut.razem AT siol.net> +* Vangelis Rokas <vrokas AT otenet.gr> +* Erik Petrich <epetrich AT ivorytower.norman.ok.us> +* Paul Stoffregen <paul AT pjrc.com> +* Michael Hope <michaelh AT juju.net.nz> <nz_michaelh AT yahoo.com> +* Maarten Brock <sourceforge.brock AT dse.nl> +* Raphael Neider <RNeider AT web.de> +* Hans-Juergen Dorn <hans.dorn AT apl-landau.de> +* Klaus Flittner <klaus_flittner AT gmx.de> +* Philipp Klaus Krause <pkk AT spth.de> +* Leland Morrison <enigmalee.AT.sourceforget.net> +* Molnar Karoly <molnarkaroly AT users.sf.net> +* Ben Shi <powerstudio1st AT 163.com> + +SDCC includes code from: +* Alan Baldwin <baldwin AT shop-pdp.kent.edu> + Initial version of ASXXXX and ASLINK. +* John Hartman <noice AT noicedebugger.com> + Porting ASXXXX and ASLINK for 8051. +* Dmitry S. Obukhov <dso AT usa.net> + malloc and serial I/O routines. +* Pascal Felber + Some of the Z80 related files are borrowed from the Gameboy + Development Kit (GBDK). +* The GCC development team http://gcc.gnu.org/ + for GNU C preprocessor, the basis of sdcpp preprocessor and + gcc test suite, partially included into the SDCC regression test suite +* The GNU Binutils development team http://www.gnu.org/software/binutils/ + for GNU Binutils, the basis of sdbinutils +* Boost Community http://www.boost.org/ + for Boost C++ libraries used in sdcc compiler +* Timo Bingmann http://idlebox.net/2007/stx-btree/ + for TX B+ Tree C++ Template Classes used in sdcc compiler +* Malini Dutta <malini AT mediaone.net> + Sandeep's wife, for her patience and support. diff --git a/doc/clean.mk b/doc/clean.mk new file mode 100644 index 0000000..391661b --- /dev/null +++ b/doc/clean.mk @@ -0,0 +1,21 @@ +clean: + rm -rf $(MANUAL).html $(TSS).html $(CDB).html + rm -rf $(MANUAL).txt $(TSS).txt $(CDB).txt \ + *.pdf *.tex *.aux *.dvi *.idx *.ilg *.out\ + *.ind *.log *.toc *~ \#* *.ps */*.css */*.pl *.gif core *.glo *.eps + rm -rf sdcc-doc sdcc-doc.tar.bz2 + if [ "$(srcdir)" != "." ]; then rm -f *.lyx; fi + +# Deleting all files created by configuring or building the program +# ----------------------------------------------------------------- +distclean: clean + rm -f Makefile + +# Like clean but some files may still exist +# ----------------------------------------- +mostlyclean: clean + +# Deleting everything that can reconstructed by this Makefile. It deletes +# everything deleted by distclean plus files created by bison, etc. +# ----------------------------------------------------------------------- +realclean: distclean diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx new file mode 100644 index 0000000..46fb0f8 --- /dev/null +++ b/doc/sdccman.lyx @@ -0,0 +1,73320 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass book +\begin_preamble +% Added by lyx2lyx +% for proper underlining +\PassOptionsToPackage{normalem}{ulem} +\usepackage{ulem} +\let\cite@rig\cite +\newcommand{\b@xcite}[2][\%]{\def\def@pt{\%}\def\pas@pt{#1} + \mbox{\ifx\def@pt\pas@pt\cite@rig{#2}\else\cite@rig[#1]{#2}\fi}} +\renewcommand{\underbar}[1]{{\let\cite\b@xcite\uline{#1}}} +\pdfoptionpdfminorversion=3 +% +\sloppy +\tolerance=500 +\emergencystretch=30pt +% +\date{} +\end_preamble +\use_default_options false +\begin_modules +logicalmkup +\end_modules +\maintain_unincluded_children false +\language english +\language_package default +\inputencoding utf8 +\fontencoding global +\font_roman "times" "default" +\font_sans "helvet" "default" +\font_typewriter "courier" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_title "SDCC Compiler User Guide" +\pdf_author "SDCC development team" +\pdf_subject "installation, user manual" +\pdf_keywords "68hc08 8032 8051 ansi iso c compiler assembler CPU DS390 embedded development free Floating Point Arithmetic Freescale GPL HC08 S08 inline Intel ISO/IEC 9899:1990 Linux MAC OS X manual Maxim mcs51 Microchip microcontroller open source PIC Unix Windows Z80 Z180 Zilog Rabbit" +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 1 +\pdf_breaklinks false +\pdf_pdfborder false +\pdf_colorlinks true +\pdf_backref false +\pdf_pdfusetitle true +\papersize letterpaper +\use_geometry true +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 0 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 0 +\use_minted 0 +\branch test +\selected 0 +\filename_suffix 0 +\color #faf0e6 +\end_branch +\index Index +\shortcut idx +\color #008000 +\end_index +\leftmargin 30mm +\topmargin 20mm +\rightmargin 25mm +\bottommargin 20mm +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style swedish +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle fancy +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Please note: double dashed longoptions (e.g. + –version) are written this way: - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\end_layout + +\begin_layout Plain Layout +Two resp. + three consecutive dashes would otherwise result in a long resp. + extra long dash. +\end_layout + +\begin_layout Plain Layout +Architecture specific stuff (like memory models, code examples) should maybe + later go +\end_layout + +\begin_layout Plain Layout +into separate sections/chapters/appendices (it is hard to document PIC or + Z80 in +\end_layout + +\begin_layout Plain Layout +a 8051 centered document) - for now simply add. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Title +SDCC Compiler User Guide +\end_layout + +\begin_layout Date + +\size normal +SDCC +\begin_inset CommandInset include +LatexCommand input +filename "sdcc_version" + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\size footnotesize +$Date:: 2019-04-24 #$ +\begin_inset Newline newline +\end_inset + +$Revision: 11239 $ +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +The above strings enclosed in $ are automatically updated by Subversion +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset toc +LatexCommand tableofcontents + +\end_inset + + +\end_layout + +\begin_layout Chapter +Introduction +\end_layout + +\begin_layout Section +About SDCC +\end_layout + +\begin_layout Standard + +\series bold +SDCC +\series default + ( +\emph on +S +\emph default +mall +\emph on +D +\emph default +evice +\emph on +C +\emph default + +\emph on +C +\emph default +ompiler) is free open source, retargettable, optimizing standard (ANSI C89 + / ISO C90, ISO C99, ISO C11 / ISO C17) C compiler suite originally written + by +\series bold +Sandeep Dutta +\series default + designed for 8 bit Microprocessors. + The current version targets Intel MCS51 based Microprocessors (8031, 8032, + 8051, 8052 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +8031, 8032, 8051, 8052, mcs51 CPU +\end_layout + +\end_inset + +, etc.), Dallas DS80C390 variants, Freescale (formerly Motorola) HC08 based + (hc08, s08), Zilog Z80 based MCUs (Z80, Z180, gbz80, Rabbit 2000/3000, + Rabbit 3000A +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80, Z180, GBZ80, Rabbit 2000/3000, Rabbit 3000A CPU +\end_layout + +\end_inset + +), Toshiba TLCS-90, Zilog eZ80 in Z80 mode, STMicroelectronics STM8 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +STM8 +\end_layout + +\end_inset + + and Padauk PDK14. + It can be retargeted for other microprocessors, support for Microchip PIC + and Padauk PDK15 is under development. + The entire source code for the compiler is distributed under GPL. + SDCC uses a modified version of ASXXXX +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdas (sdasgb, sdas6808, sdas8051, sdasz80) +\end_layout + +\end_inset + + & ASLINK +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdld +\end_layout + +\end_inset + +, free open source retargetable assembler & linker. + SDCC has extensive language extensions suitable for utilizing various microcont +rollers and underlying hardware effectively. + +\begin_inset Newline newline +\end_inset + +You might also want to have a look at the wiki +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/ +\end_layout + +\end_inset + +. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +In addition to the MCU specific optimizations SDCC also does a host of standard + optimizations like: +\end_layout + +\begin_layout Itemize +global sub expression elimination, +\end_layout + +\begin_layout Itemize +loop optimizations (loop invariant, strength reduction of induction variables + and loop reversing), +\end_layout + +\begin_layout Itemize +constant folding & propagation, +\end_layout + +\begin_layout Itemize +copy propagation, +\end_layout + +\begin_layout Itemize +dead code elimination +\end_layout + +\begin_layout Itemize +jump tables for +\emph on +switch +\emph default + statements. +\end_layout + +\begin_layout Standard +For the back-end SDCC uses a global register allocation scheme which should + be well suited for other 8 bit MCUs. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The peep hole optimizer uses a rule based substitution mechanism which is + MCU independent. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Supported data-types are: +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="10" columns="5"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top" width="20text%"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +type +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +width +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed range +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned range +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_Bool / bool +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8 bits, 1 byte +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0, 1 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +char +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8 bits, 1 byte +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-128, +127 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0, +255 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +short +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16 bits, 2 bytes +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-32.768, +32.767 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0, +65.535 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +int +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16 bits, 2 bytes +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-32.768, +32.767 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0, +65.535 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +long +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +32 bits, 4 bytes +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-2.147.483.648, +2.147.483.647 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0, +4.294.967.295 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +long long +\begin_inset Foot +status open + +\begin_layout Plain Layout +Incomplete support in the pic14 and pic16 backends. +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +64 bits, 8 bytes +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +float +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +4 bytes similar to IEEE 754 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.175494351E-38, +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +3.402823466E+38 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pointer +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1, 2, 3 or 4 bytes +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +generic +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__bit +\begin_inset Foot +status open + +\begin_layout Plain Layout +Only supported in the mcs51, ds390, ds400 backends. +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 bit +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0, 1 +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + +The compiler also allows +\emph on +inline assembler code +\emph default + to be embedded anywhere in a function. + In addition, routines developed in assembly can also be called. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +SDCC also provides an option (- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-cyclomatic) to report the relative complexity of a function. + These functions can then be further optimized, or hand coded in assembly + if needed. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +SDCC also comes with a companion source level debugger SDCDB. + The debugger currently uses ucSim, a free open source simulator for 8051 + and other micro-controllers. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The latest SDCC version can be downloaded from +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + +. + +\emph on +Please note: the compiler will probably always be some steps ahead of this + documentation +\series bold +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Status of documentation +\end_layout + +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Obviously this has pros and cons +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +SDCC Suite Licenses +\end_layout + +\begin_layout Standard +SDCC suite is a collection of several components derived from different + sources with different licenses: +\end_layout + +\begin_layout Itemize +executables: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Itemize +sdcc compiler: +\begin_inset Newline newline +\end_inset + +sdcc compiler is licensed under the GPLv2. +\begin_inset Newline newline +\end_inset + +The code or object files generated by SDCC suite are not licensed, so they + can be used in FLOSS or proprietary (closed source) applications. +\end_layout + +\begin_layout Itemize +sdcpp preprocessor: +\begin_inset Newline newline +\end_inset + +derived from GCC cpp preprocessor +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://gcc.gnu.org/ +\end_layout + +\end_inset + +; GPLv3 license +\end_layout + +\begin_layout Itemize +sdas assemblers and sdld linker: +\begin_inset Newline newline +\end_inset + +derived from ASXXXX +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://shop-pdp.kent.edu/ashtml/asxxxx.htm +\end_layout + +\end_inset + +; GPLv3 license +\end_layout + +\begin_layout Itemize +SDCC run-time libraries: +\begin_inset Newline newline +\end_inset + +The great majority of SDCC run-time libraries are licensed under the GPLv2+LE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GPLv2+LE +\end_layout + +\end_inset + + which allows linking of SDCC run-time libraries with proprietary (closed + source) applications. +\begin_inset Newline newline +\end_inset + +Exception are pic device libraries and header files which are derived from + Microchip header (.inc) and linker script (.lkr) files. + Microchip requires that "The header files should state that they are only + to be used with authentic Microchip devices" which makes them incompatible + with the GPL. + Pic device libraries and header files are located at non-free/lib and non-free/ +include directories respectively. + SDCC should be run with the +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series default +use-non-free +\series bold + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + +\series default + command line option in order to include non-free header files and libraries. + +\end_layout + +\begin_layout Itemize +sdbinutils utilities (sdar, sdranlib, sdnm, sdobjcopy): +\begin_inset Newline newline +\end_inset + +derived from GNU Binutils +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.gnu.org/software/binutils/ +\end_layout + +\end_inset + +; GPLv3 license +\end_layout + +\begin_layout Itemize +ucsim simulators: +\begin_inset Newline newline +\end_inset + +GPLv2 license +\end_layout + +\begin_layout Itemize +sdcdb debugger: +\begin_inset Newline newline +\end_inset + +GPLv2 license +\end_layout + +\begin_layout Itemize +gcc-test regression tests: +\begin_inset Newline newline +\end_inset + +derived from gcc-testsuite; no license explicitely specified, but since + it is a part of GCC is probably GPLv3 licensed +\end_layout + +\begin_layout Itemize +packihx: +\begin_inset Newline newline +\end_inset + +public domain +\end_layout + +\begin_layout Itemize +makebin: +\begin_inset Newline newline +\end_inset + +zlib/libpng License +\end_layout + +\end_deeper +\begin_layout Itemize +libraries: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Itemize +dbuf library: +\begin_inset Newline newline +\end_inset + +zlib/libpng License +\end_layout + +\begin_layout Itemize +Boost C++ libraries: +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.boost.org/ +\end_layout + +\end_inset + +; Boost Software License 1.0 (BSL-1.0) +\end_layout + +\end_deeper +\begin_layout Standard +Links to licenses: +\end_layout + +\begin_layout Itemize +GPLv2 license +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GPLv2 license +\end_layout + +\end_inset + +: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.gnu.org/licenses/old-licenses/gpl-2.0.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +LGPLv2.1 license +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +LGPLv2.1 license +\end_layout + +\end_inset + +: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +GPLv3 license +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GPLv3 license +\end_layout + +\end_inset + +: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.gnu.org/licenses/gpl.html +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +zlib/libpng License +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +zlib/libpng License +\end_layout + +\end_inset + +: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.opensource.org/licenses/Zlib +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +Boost Software License 1.0 (BSL-1.0) +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Boost Software License 1.0 (BSL-1.0) +\end_layout + +\end_inset + +: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.opensource.org/licenses/BSL-1.0 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Documentation +\end_layout + +\begin_layout Standard +This documentation is maintained using a free open source word processor + (\SpecialChar LyX +) +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.lyx.org/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +Typographic conventions +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Typographic conventions +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Throughout this manual, we will use the following convention. + Commands you have to type in are printed in +\family sans +\series bold +"sans serif" +\series default +. + +\family default + Code samples are printed in +\family typewriter +typewriter font. + +\family default + Interesting items and new terms are printed in +\emph on +italic. +\end_layout + +\begin_layout Section +Compatibility +\begin_inset CommandInset label +LatexCommand label +name "sec:Compatibility-with-previous" + +\end_inset + + with previous versions +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Compatibility with previous versions +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Newer versions have usually numerous bug fixes compared with the previous + version. + But we also sometimes introduce some incompatibilities with older versions. + Not just for the fun of it, but to make the compiler more stable, efficient + and standard compliant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Standard-compliance +\end_layout + +\end_inset + + (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Standard-Compliance" + +\end_inset + + for Standard-Compliance). + This is a list of such changes . +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +It would be fine to add to each item, in which version was it changed. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +short is now equivalent to int (16 bits), it used to be equivalent to char + (8 bits) which is not ANSI compliant. + To maintain compatibility, old programs could be compiled using the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-short-is-8bits command line option (option removed after the 3.6.0 release). +\end_layout + +\begin_layout Itemize +the default directory for gcc-builds where include, library and documentation + files are stored is now in /usr/local/share. +\end_layout + +\begin_layout Itemize +char type parameters to vararg +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +vararg, va +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +arg +\end_layout + +\end_inset + + functions are casted to int unless explicitly casted and +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + and +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\end_layout + +\end_inset + + +\series default + command line option are not defined, e.g.: +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +char a=3; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +printf ("%d %c +\backslash +n", a, (char)a); +\family default + +\begin_inset Newline newline +\end_inset + + will push a as an int and as a char resp if +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + and +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\end_layout + +\end_inset + + +\series default + command line options are not defined, +\begin_inset Newline newline +\end_inset + + will push a as two ints if +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + or +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\end_layout + +\end_inset + + +\series default + command line option is defined. +\end_layout + +\begin_layout Itemize +pointer type parameters to vararg +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +vararg, va +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +arg +\end_layout + +\end_inset + + functions are casted to generic pointers on Harvard architectures (e.g. + mcs51, ds390) unless explicitly casted and +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + and +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\end_layout + +\end_inset + + +\series default + command line option are not defined. +\end_layout + +\begin_layout Itemize +option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-regextend has been removed. +\end_layout + +\begin_layout Itemize +option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noregparms has been removed. +\end_layout + +\begin_layout Itemize +option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-after-data has been removed. +\end_layout + +\begin_layout Itemize +bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +bit +\end_layout + +\end_inset + + and sbit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sbit +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sbit +\end_layout + +\end_inset + + types now consistently behave like the C99 _Bool type with respect to type + conversion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +type conversion +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +type promotion +\end_layout + +\end_inset + +. + The most common incompatibility resulting from this change is related to + bit toggling +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Bit toggling +\end_layout + +\end_inset + + idioms, e.g.: +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +bit b; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +b = ~ +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +~ Operator +\end_layout + +\end_inset + +b; /* equivalent to b=1 instead of toggling b */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +b = !b; /* toggles b */ +\begin_inset Newline newline +\end_inset + + +\family default +In previous versions, both forms would have toggled the bit. +\end_layout + +\begin_layout Itemize +in older versions, the preprocessor was always called with +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\end_layout + +\end_inset + + +\series default + regardless of the +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-xxx +\series default + setting. + This is no longer true, and can cause compilation failures on code built + with +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + but using c99 preprocessor features, such as one-line (//) comments +\end_layout + +\begin_layout Itemize +in versions older than 2.8.4 the pic16 *printf() and printf_tiny() library + functions supported undocumented and not standard compliant 'b' binary + format specifier ("%b", "%hb" and "%lb"). + The 'b' specifier is now disabled by default. + It can be enabled by defining BINARY_SPECIFIER macro in files device/lib/pic16/ +libc/stdio/vfprintf.c and device/lib/pic16/libc/stdio/printf_tiny.c and recompilin +g the library. +\end_layout + +\begin_layout Itemize +in versions older then 2.8.5 the unnamed bit-field structure members participated + in initialization, which is not conforming with ISO/IEC 9899:1999 standard + (see section Section 6.7.8 Initialization, clause 9) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Old behaviour, before version 2.8.5: +\family typewriter + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +struct { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int a : 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +char +\begin_inset space ~ +\end_inset + + : 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int b : 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +} s = {1, 2, 3}; +\family default + +\begin_inset Newline newline +\end_inset + + +\family typewriter +/* s.a = 1, s.b = 3 */ +\family default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +New behaviour: +\family typewriter + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +struct { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int a : 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +char +\begin_inset space ~ +\end_inset + + : 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int b : 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +} s = {1, 2}; +\family default + +\begin_inset Newline newline +\end_inset + + +\family typewriter +/* s.a = 1, s.b = 2 */ +\end_layout + +\begin_layout Itemize +In 2.9.0 libraries included in SDCC packages, are in ar format. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Using-sdar-to" + +\end_inset + +. +\end_layout + +\begin_layout Itemize +In 3.0.0 targets for xa51 and avr are disabled by default. +\end_layout + +\begin_layout Itemize +In 3.0.0 sdldgb and sdldz80 don't support generation of Game Boy binary image + format. + The makebin utility can be used to convert Intel Hex format to Game Boy + binary image format. +\end_layout + +\begin_layout Itemize +In 3.0.0 sdldgb and sdldz80 don't support generation of rrgb (Game Boy simulator) + map file and no$gmb symbol file formats. + The as2gbmap utility can be used to convert sdld map format to rrgb and + no$gmb file formats. +\end_layout + +\begin_layout Itemize +In 3.1.0 asranlib utility was renamed to sdranlib. +\end_layout + +\begin_layout Itemize +In 3.1.0 pic14 target, structured access to SFR via +\family typewriter +<sfrname>_bits.<bitname> +\family default + is deprecated and replaced by +\family typewriter +<sfrname>bits.<bitname> +\family default +. + It will be obsoleted (removed) in one of next SDCC releases. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Naming-of-special" + +\end_inset + +. +\end_layout + +\begin_layout Itemize +sdar archive managing utility and sdnm utilities were introduced in version + 3.2.0. + sdar, sdranlib and sdnm are derived from GNU Binutils package. +\end_layout + +\begin_layout Itemize +In 3.2.0 the sdcclib utility is deprecated. + Sdar utility should be used to create SDCC object file archives. + Sdcclib utility will become obsolete in one of next SDCC releases and will + be removed from SDCC packages. +\end_layout + +\begin_layout Itemize +In 3.2.0 special SDCC keywords which are not preceded by a double underscore + are obsoleted (removed). + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Standard-Compliance" + +\end_inset + + Standard-Compliance. +\end_layout + +\begin_layout Itemize +In 3.2.0 compiler macro definitions not starting with double underscore characters + are deprecated if +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--std-cXX +\end_layout + +\end_inset + + command line option is defined. + They have been obsoleted (removed) after the 3.4.0 release (except for the + macro SDCC, which has been removed after the 3.6.0 release (and brought back + for mcs51 for the 3.7.0 release)). +\end_layout + +\begin_layout Itemize +In 3.2.0 new compiler macros for processor definition were introduced for + pic14 and pic16 targets: -D__SDCC_PIC16XXXX and -D__SDCC_PIC18FXXX respectively. + The pic16 macro definition -D__18fXXX is deprecated. + It was obsoleted (removed) after the 3.4.0 release. +\end_layout + +\begin_layout Itemize +In 3.2.0 pragma config for pic16 target was introduced. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:PIC16_Pragmas" + +\end_inset + + +\end_layout + +\begin_layout Itemize +In 3.2.0 new inline assembler format +\family typewriter +__asm__ (inline_assembler_code +\begin_inset Quotes srd +\end_inset + +); +\family default + as an addition to +\family typewriter +__asm ... + __endasem; +\family default + format introduced. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Inline-Assembler-Code" + +\end_inset + + +\end_layout + +\begin_layout Itemize +sdobjcopy utility was introduced in version 3.3.0. + It is derived from GNU Binutils package. +\end_layout + +\begin_layout Itemize +Before 3.4.0 release, intrinsic named address spaces were called +\begin_inset Quotes sld +\end_inset + +storage classes +\begin_inset Quotes srd +\end_inset + + in this manual. +\end_layout + +\begin_layout Itemize +In 3.6.0, the default for char changed from signed to unsigned. +\end_layout + +\begin_layout Itemize +In 3.7.0, the prototype for putchar() changed from void putchar(char) to int + putchar(int) +\end_layout + +\begin_layout Itemize +In 3.7.0 mcs51 and ds390 got a full _Bool/bool type, separate from __bit. +\end_layout + +\begin_layout Itemize +In 3.7.0, the option –nojtbound and the corresponding pragma have been deprecated. +\end_layout + +\begin_layout Itemize +In 3.7.0, the prototype for getchar() changed from char getchar(void) to int + getchar(). +\end_layout + +\begin_layout Itemize +In 3.8.6, the deprecated sdcclib was removed. +\end_layout + +\begin_layout Section +System Requirements +\end_layout + +\begin_layout Standard +What do you need before you start installation of SDCC? A computer, and + a desire to compute. + The preferred method of installation is to compile SDCC from source using + GNU GCC and make. + For Windows some pre-compiled binary distributions are available for your + convenience. + You should have some experience with command line tools and compiler use. +\end_layout + +\begin_layout Section +Other Resources +\end_layout + +\begin_layout Standard +The SDCC home page at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/ +\end_layout + +\end_inset + + is a great place to find distribution sets. + You can also find links to the user mailing lists that offer help or discuss + SDCC with other SDCC users. + Web links to other SDCC related sites can also be found here. + This document can be found in the doc directory of the source package. + The latest snapshot build version of this document in pdf format is available + at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/doc/sdccman.pdf +\end_layout + +\end_inset + +. + Some of the other tools (simulator and assembler) included with SDCC contain + their own documentation and can be found in the source distribution. + If you want the latest unreleased software, the complete source package + is available directly from Subversion on +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/code/8805/tree/trunk/sdcc/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Chapter +Installing SDCC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Installation +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +For most users it is sufficient to skip to either section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Building-SDCC-on-Linux" + +\end_inset + + (Unix) or section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Windows-Install" + +\end_inset + + (Windows). + More detailed instructions follow below. +\end_layout + +\begin_layout Section +Configure Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options SDCC configuration +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The install paths, search paths and other options are defined when running + 'configure'. + The defaults can be overridden by: +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-prefix see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-exec_prefix see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-bindir see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-datadir see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-datarootdir see table below +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +docdir environment variable, see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +include_dir_suffix environment variable, see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +non_free_include_dir_suffix environment variable, see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +lib_dir_suffix environment variable, see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +non_free_lib_dir_suffix environment variable, see table below +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdccconf_h_dir_separator environment variable, either / or +\backslash + +\backslash + makes sense here. + This character will only be used in sdccconf.h; don't forget it's a C-header, + therefore a double-backslash is needed there. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-mcs51-port Excludes the Intel mcs51 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-z80-port Excludes the z80 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-z180-port Excludes the z180 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-r2k-port Excludes the r2k port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-r3ka-port Excludes the r3ka port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-gbz80-port Excludes the Game Boy gbz80 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-avr-port Excludes the AVR port (disabled by default) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-ds390-port Excludes the DS390 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-hc08-port Excludes the HC08 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-s08-port Excludes the S08 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-stm8-port Excludes the STM8 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-pic-port Excludes the PIC14 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-pic16-port Excludes the PIC16 port +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-xa51-port Excludes the XA51 port (disabled by default) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-ucsim Disables configuring and building of ucsim +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-device-lib Disables automatically building device libraries +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-packihx Disables building packihx +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-enable-doc Build pdf, html and txt files from the lyx sources +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-enable-libgc Use the Bohem memory allocator. + Lower runtime footprint. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-without-ccache Do not use ccache even if available +\end_layout + +\begin_layout Standard +Furthermore the environment variables CC, CFLAGS, ... + the tools and their arguments can be influenced. + Please see `configure - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-help' and the man/info pages of `configure' for details. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The names of the standard libraries STD_LIB, STD_INT_LIB, STD_LONG_LIB, + STD_FP_LIB, STD_DS390_LIB, STD_XA51_LIB and the environment variables SDCC_DIR_ +NAME, SDCC_INCLUDE_NAME, SDCC_LIB_NAME are defined by `configure' too. + At the moment it's not possible to change the default settings (it was + simply never required). +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +These configure options are compiled into the binaries, and can only be + changed by rerunning 'configure' and recompiling SDCC. + The configure options are written in +\emph on +italics +\emph default + to distinguish them from run time environment variables (see section search + paths). +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The settings for +\begin_inset Quotes sld +\end_inset + +Win32 builds +\begin_inset Quotes srd +\end_inset + + are used by the SDCC team to build the official Win32 binaries. + The SDCC team uses Mingw32 to build the official Windows binaries, because + it's +\end_layout + +\begin_layout Enumerate +open source, +\end_layout + +\begin_layout Enumerate +a gcc compiler and last but not least +\end_layout + +\begin_layout Enumerate +the binaries can be built by cross compiling on SDCC Distributed Compile + Farm. +\end_layout + +\begin_layout Standard +See the examples, how to pass the Win32 settings to 'configure'. + The other Win32 builds using VC or whatever don't use 'configure', but + a header file sdcc_vc.h.in is the same as sdccconf.h built by 'configure' + for Win32. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +These defaults are: +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="11" columns="3"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="0in"> +<column alignment="block" valignment="top" width="0in"> +<column alignment="block" valignment="top" width="0in"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Variable +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Win32 builds +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +PREFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +EXEC_PREFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$PREFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$PREFIX +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +BINDIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$EXEC_PREFIX +\emph default +/bin +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$EXEC_PREFIX +\emph default + +\backslash +bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +DATADIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATAROOTDIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATAROOTDIR +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +DATAROOTDIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$PREFIX +\emph default +/share +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$PREFIX +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +DOCDIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATAROOTDIR +\emph default +/sdcc/doc +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATAROOTDIR +\emph default + +\backslash +doc +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +NON_FREE_INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/non-free/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +non-free/include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +LIB_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/lib +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +lib +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +NON_FREE_LIB_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/non-free/lib +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +non-free/lib +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +'configure' also computes relative paths. + This is needed for full relocatability of a binary package and to complete + search paths (see section search paths below): +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="4" columns="3"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="0in"> +<column alignment="block" valignment="top" width="0in"> +<column alignment="block" valignment="top" width="0in"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Variable (computed) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Win32 builds +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +BIN2DATA_DIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +../share +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +.. +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +PREFIX2BIN_DIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +bin +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +PREFIX2DATA_DIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +share/sdcc +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +Examples: +\end_layout + +\begin_layout LyX-Code +./configure +\begin_inset Newline newline +\end_inset + +./configure - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-prefix= +\begin_inset Quotes srd +\end_inset + +/usr/bin +\begin_inset Quotes srd +\end_inset + + - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-datarootdir= +\begin_inset Quotes srd +\end_inset + +/usr/share +\begin_inset Quotes srd +\end_inset + + +\begin_inset Newline newline +\end_inset + +./configure - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-avr-port - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-xa51-port +\end_layout + +\begin_layout Standard +To cross compile on linux for Mingw32 (see also 'sdcc/support/scripts/sdcc_mingw +32'): +\end_layout + +\begin_layout LyX-Code +./configure +\backslash + +\begin_inset Newline newline +\end_inset + +CC= +\begin_inset Quotes srd +\end_inset + +i586-mingw32msvc-gcc +\begin_inset Quotes srd +\end_inset + + CXX= +\begin_inset Quotes srd +\end_inset + +i586-mingw32msvc-g++ +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +RANLIB= +\begin_inset Quotes srd +\end_inset + +i586-mingw32msvc-ranlib +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +STRIP= +\begin_inset Quotes srd +\end_inset + +i586-mingw32msvc-strip +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-prefix= +\begin_inset Quotes srd +\end_inset + +/sdcc +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-datarootdir= +\begin_inset Quotes srd +\end_inset + +/sdcc +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +docdir= +\begin_inset Quotes srd +\end_inset + + +\backslash +${datarootdir}/doc +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +include_dir_suffix= +\begin_inset Quotes srd +\end_inset + +include +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +non_free_include_dir_suffix= +\begin_inset Quotes srd +\end_inset + +non-free/include +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +lib_dir_suffix= +\begin_inset Quotes srd +\end_inset + +lib +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +non_free_lib_dir_suffix= +\begin_inset Quotes srd +\end_inset + +non-free/lib +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +sdccconf_h_dir_separator= +\begin_inset Quotes srd +\end_inset + + +\backslash + +\backslash + +\backslash + +\backslash + +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-device-lib +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-host=i586-mingw32msvc +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-build=unknown-unknown-linux-gnu +\end_layout + +\begin_layout Standard +To +\begin_inset Quotes sld +\end_inset + +cross +\begin_inset Quotes srd +\end_inset + +compile on Cygwin for Mingw32 (see also sdcc/support/scripts/sdcc_cygwin_mingw32 +): +\end_layout + +\begin_layout LyX-Code +./configure -C +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-prefix= +\begin_inset Quotes srd +\end_inset + +/sdcc +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-datarootdir= +\begin_inset Quotes srd +\end_inset + +/sdcc +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +docdir= +\begin_inset Quotes srd +\end_inset + + +\backslash +${datarootdir}/doc +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +include_dir_suffix= +\begin_inset Quotes srd +\end_inset + +include +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +non_free_include_dir_suffix= +\begin_inset Quotes srd +\end_inset + +non-free/include +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +lib_dir_suffix= +\begin_inset Quotes srd +\end_inset + +lib +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +non_free_lib_dir_suffix= +\begin_inset Quotes srd +\end_inset + +non-free/lib +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +sdccconf_h_dir_separator= +\begin_inset Quotes srd +\end_inset + + +\backslash + +\backslash + +\backslash + +\backslash + +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +CC= +\begin_inset Quotes srd +\end_inset + +gcc -mno-cygwin +\begin_inset Quotes srd +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + +CXX= +\begin_inset Quotes srd +\end_inset + +g++ -mno-cygwin +\begin_inset Quotes srd +\end_inset + + +\end_layout + +\begin_layout Standard +'configure' is quite slow on Cygwin (at least on windows before Win2000/XP). + The option '- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-C' turns on caching, which gives a little bit extra speed. + However if options are changed, it can be necessary to delete the config.cache + file. +\end_layout + +\begin_layout Section +Install paths +\begin_inset CommandInset label +LatexCommand label +name "subsec:Install-paths" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Install paths +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="7" columns="4"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top" width="4.5cm"> +<column alignment="left" valignment="top" width="4cm"> +<column alignment="left" valignment="top" width="4cm"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Path +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Win32 builds +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Binary files* +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$EXEC_PREFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/bin +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\backslash +bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Include files +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\backslash +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Non-free include files +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/non-free/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\backslash +non-free +\backslash +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Library file** +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/lib +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\backslash +lib +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Library file** +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/non-free/lib +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\backslash +non-free +\backslash +lib +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Documentation +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DOCDIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/doc +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\backslash +sdcc +\backslash +doc +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Verse + +\size footnotesize +*compiler, preprocessor, assembler, and linker +\begin_inset Newline newline +\end_inset + +**the +\shape italic +model +\shape default + is auto-appended by the compiler, e.g. + small, large, z80, ds390 etc +\end_layout + +\begin_layout Standard +\noindent +The install paths can still be changed during `make install' with e.g.: +\end_layout + +\begin_layout LyX-Code +make install prefix=$(HOME)/local/sdcc +\end_layout + +\begin_layout Standard +Of course this doesn't change the search paths compiled into the binaries. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Moreover the install path can be changed by defining DESTDIR +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DESTDIR +\end_layout + +\end_inset + +: +\end_layout + +\begin_layout LyX-Code +make install DESTDIR=$(HOME)/sdcc.rpm/ +\end_layout + +\begin_layout Standard +Please note that DESTDIR must have a trailing slash! +\end_layout + +\begin_layout Section +Search Paths +\begin_inset CommandInset label +LatexCommand label +name "subsec:Search-Paths" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Search path +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Some search paths or parts of them are determined by configure variables + (in +\emph on +italics +\emph default +, see section above). + Further search paths are determined by environment variables during runtime. + +\begin_inset Newline newline +\end_inset + +The paths searched when running the compiler are as follows (the first catch + wins): +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +1. + Binary files (preprocessor, assembler and linker) +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="4" columns="3"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="0in"> +<column alignment="block" valignment="top" width="0in"> +<column alignment="block" valignment="top" width="0in"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Search path +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Win32 builds +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\emph on +$PPREFIX2BIN_DIR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/bin +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME +\backslash +bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Path of argv[0] (if available) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Path of argv[0] +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Path of argv[0] +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$PATH +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$PATH +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$PATH +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +2. + Include files +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="9" columns="4"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="0.5cm"> +<column alignment="block" valignment="top" width="4.8cm"> +<column alignment="block" valignment="top" width="4.8cm"> +<column alignment="block" valignment="top" width="0in"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +# +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Search path +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Win32 builds +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-I dir +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-I dir +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-I dir +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_INCLUDE +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_INCLUDE +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_INCLUDE +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\begin_inset Newline newline +\end_inset + + +\emph on +$PREFIX2DATA_DIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\begin_inset Newline newline +\end_inset + +share/sdcc/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME +\backslash +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/ +\begin_inset Newline newline +\end_inset + + +\emph on +$BIN2DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/../ +\begin_inset Newline newline +\end_inset + +sdcc/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0]) +\backslash +.. +\backslash +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +(not on Win32) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\begin_inset Newline newline +\end_inset + + +\emph on +$PREFIX2DATA_DIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/share/ +\begin_inset Newline newline +\end_inset + +sdcc/non-free/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME +\backslash +non-free +\backslash +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/ +\begin_inset Newline newline +\end_inset + + +\emph on +$BIN2DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/../ +\begin_inset Newline newline +\end_inset + +sdcc/non-free/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0]) +\backslash +.. +\backslash +non-free +\backslash +include +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$INCLUDE_DIR_SUFFIX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/ +\begin_inset Newline newline +\end_inset + +sdcc/non-free/include +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +(not on Win32) +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +The option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdinc disables all search paths except #1 and #2. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +3. + Library files +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +With the exception of +\begin_inset Quotes sld +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-L dir +\begin_inset Quotes srd +\end_inset + + the +\shape italic +model +\shape default + is auto-appended by the compiler (e.g. + small, large, z80, ds390 etc.). +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="10" columns="4"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="0.5cm"> +<column alignment="block" valignment="top" width="4.5cm"> +<column alignment="block" valignment="top" width="5cm"> +<column alignment="block" valignment="top" width="4.5cm"> +<row> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +# +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Search path +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +default +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Win32 builds +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-L dir +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-L dir +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-L dir +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_LIB/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_LIB/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_LIB/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_LIB +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_LIB +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_LIB +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\begin_inset Newline newline +\end_inset + + +\emph on +$PREFIX2DATA_DIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\begin_inset Newline newline +\end_inset + +share/sdcc/lib/< +\emph on +model> +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME +\backslash + +\begin_inset Newline newline +\end_inset + +lib +\backslash + +\emph on +<model> +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/ +\begin_inset Newline newline +\end_inset + + +\emph on +$BIN2DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/../sdcc/ +\begin_inset Newline newline +\end_inset + +lib/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0]) +\backslash + +\begin_inset Newline newline +\end_inset + +.. +\backslash +lib +\backslash + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +6 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/sdcc/ +\begin_inset Newline newline +\end_inset + +lib/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +(not on Win32) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +7 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/ +\begin_inset Newline newline +\end_inset + + +\emph on +$PREFIX2DATA_DIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME/share/sdcc/ +\begin_inset Newline newline +\end_inset + +non-free/lib/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +$SDCC_HOME +\backslash + +\begin_inset Newline newline +\end_inset + +lib +\backslash +non-free +\emph on + +\backslash +<model> +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/ +\begin_inset Newline newline +\end_inset + + +\emph on +$BIN2DATADIR/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0])/../sdcc/ +\begin_inset Newline newline +\end_inset + +non-free/lib/ +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +path(argv[0]) +\backslash +.. +\backslash + +\begin_inset Newline newline +\end_inset + +lib +\backslash +non-free +\emph on + +\backslash +<model> +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +9 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +$DATADIR/non-free/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +$LIB_DIR_SUFFIX/ +\emph default + +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +/usr/local/share/sdcc/ +\begin_inset Newline newline +\end_inset + +non-free/lib/ +\begin_inset Newline newline +\end_inset + + +\emph on +<model> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +(not on Win32) +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Don't delete any of the stray spaces in the table above without checking + the HTML output (last line)! +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\begin_inset Newline newline +\end_inset + +The option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdlib disables all search paths except #1 and #2. +\end_layout + +\begin_layout Section +Building SDCC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Building SDCC +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Building SDCC on Linux +\begin_inset CommandInset label +LatexCommand label +name "subsec:Building-SDCC-on-Linux" + +\end_inset + + +\end_layout + +\begin_layout Enumerate + +\series medium +Download the source package +\series default + either from the SDCC Subversion repository or from snapshot builds +\series medium +, it will be named something like sdcc +\series default +-src +\series medium +-yyyymmdd-rrrr.t +\series default +ar. +\series medium +bz2 +\series default + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Enumerate + +\series medium +Bring up a command line terminal, such as xterm. +\end_layout + +\begin_layout Enumerate + +\series medium +Unpack the file using a command like: +\series default + +\family sans +\series bold +"tar -xvjf sdcc-src-yyyymmdd-rrrr.tar.bz2 +\begin_inset Quotes srd +\end_inset + + +\family default +\series medium +, this will create a sub-directory called sdcc with all of the sources. +\end_layout + +\begin_layout Enumerate +Change directory into the main SDCC directory, for example type: +\family sans +\series bold +"cd sdcc +\series default +". +\end_layout + +\begin_layout Enumerate + +\series medium +Type +\series default + +\family sans +\series bold +"./configure +\family default +\series default +". + This configures the package for compilation on your system. + When the treedec library is available, it should be found and used automaticall +y (improving the compilation time / code quality trade-off). + As of SDCC 3.7.0, the current develop branch from https://github.com/freetdi/tdlib + is a suitable version of treedec. +\end_layout + +\begin_layout Enumerate + +\series medium +Type +\series default + +\family sans +\series bold +"make +\family default +\series default +" +\series medium +. + +\series default + All of the source packages will compile, this can take a while. +\end_layout + +\begin_layout Enumerate + +\series medium +Type +\series default + +\family sans +\series bold +"make install" +\family default +\series default + as root +\series medium +. + +\series default + This copies the binary executables, the include files, the libraries and + the documentation to the install directories. + Proceed with section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Testing-the-SDCC" + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Building SDCC on Mac OS X +\end_layout + +\begin_layout Standard +Follow the instruction for Linux. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +On Mac OS X 10.2.x it was reported, that the default gcc (version 3.1 20020420 + (prerelease)) fails to compile SDCC. + Fortunately there's also gcc 2.9.x installed, which works fine. + This compiler can be selected by running 'configure' with: +\end_layout + +\begin_layout LyX-Code +./configure CC=gcc2 CXX=g++2 +\end_layout + +\begin_layout Standard +Universal (ppc and i386) binaries can be produced on Mac OS X 10.4.x with + Xcode. + Run 'configure' with: +\end_layout + +\begin_layout LyX-Code +./configure +\backslash + +\end_layout + +\begin_layout LyX-Code +LDFLAGS="-Wl,-syslibroot,/Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch + ppc" +\backslash + +\end_layout + +\begin_layout LyX-Code +CXXFLAGS = "-O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch + ppc" +\backslash + +\end_layout + +\begin_layout LyX-Code +CFLAGS = "-O2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" +\end_layout + +\begin_layout Subsection +Cross compiling SDCC on Linux for Windows +\end_layout + +\begin_layout Standard +With the Mingw32 gcc cross compiler it's easy to compile SDCC for Win32. + See section 'Configure Options'. +\end_layout + +\begin_layout Subsection +Building SDCC using Cygwin and Mingw32 +\end_layout + +\begin_layout Standard +For building and installing a Cygwin executable follow the instructions + for Linux. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +On Cygwin a +\begin_inset Quotes sld +\end_inset + +native +\begin_inset Quotes srd +\end_inset + + Win32-binary can be built, which will not need the Cygwin-DLL. + For the necessary 'configure' options see section 'configure options' or + the script 'sdcc/support/scripts/sdcc_cygwin_mingw32'. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +In order to install Cygwin on Windows download setup.exe from www.cygwin.com + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.cygwin.com/ +\end_layout + +\end_inset + +. + Run it, set the +\begin_inset Quotes sld +\end_inset + +default text file type +\begin_inset Quotes srd +\end_inset + + to +\begin_inset Quotes sld +\end_inset + +unix +\begin_inset Quotes srd +\end_inset + + and download/install at least the following packages. + Some packages are selected by default, others will be automatically selected + because of dependencies with the manually selected packages. + Never deselect these packages! +\end_layout + +\begin_layout Itemize +flex +\end_layout + +\begin_layout Itemize +bison +\end_layout + +\begin_layout Itemize +gcc ; version 3.x is fine, no need to use the old 2.9x +\end_layout + +\begin_layout Itemize +binutils ; selected with gcc +\end_layout + +\begin_layout Itemize +make +\end_layout + +\begin_layout Itemize +libboost-dev +\end_layout + +\begin_layout Itemize +rxvt ; a nice console, which makes life much easier under windoze (see below) +\end_layout + +\begin_layout Itemize +man ; not really needed for building SDCC, but you'll miss it sooner or + later +\end_layout + +\begin_layout Itemize +less ; not really needed for building SDCC, but you'll miss it sooner or + later +\end_layout + +\begin_layout Itemize +svn ; only if you use Subversion access +\end_layout + +\begin_layout Standard +If you want to develop something you'll need: +\end_layout + +\begin_layout Itemize +python ; for the regression tests +\end_layout + +\begin_layout Itemize +gdb ; the gnu debugger, together with the nice GUI +\begin_inset Quotes sld +\end_inset + +insight +\begin_inset Quotes srd +\end_inset + + +\end_layout + +\begin_layout Itemize +openssh ; to access the CF or commit changes +\end_layout + +\begin_layout Itemize +autoconf and autoconf-devel ; if you want to fight with 'configure', don't + use autoconf-stable! +\end_layout + +\begin_layout Standard +rxvt is a nice console with history. + Replace in your cygwin.bat the line +\end_layout + +\begin_layout LyX-Code +bash - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-login -i +\end_layout + +\begin_layout Standard +with (one line): +\end_layout + +\begin_layout LyX-Code +rxvt -sl 1000 -fn "Lucida Console-12" -sr -cr red +\end_layout + +\begin_layout LyX-Code + -bg black -fg white -geometry 100x65 -e bash - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-login +\end_layout + +\begin_layout Standard +Text selected with the mouse is automatically copied to the clipboard, pasting + works with shift-insert. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The other good tip is to make sure you have no //c/-style paths anywhere, + use /cygdrive/c/ instead. + Using // invokes a network lookup which is very slow. + If you think +\begin_inset Quotes sld +\end_inset + +cygdrive +\begin_inset Quotes srd +\end_inset + + is too long, you can change it with e.g. +\end_layout + +\begin_layout LyX-Code +mount -s -u -c /mnt +\end_layout + +\begin_layout Standard +SDCC sources use the unix line ending LF. + Life is much easier, if you store the source tree on a drive which is mounted + in binary mode. + And use an editor which can handle LF-only line endings. + Make sure not to commit files with windows line endings. + The tabulator spacing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +tabulator spacing (8 columns) +\end_layout + +\end_inset + + used in the project is 8. + Although a tabulator spacing of 8 is a sensible choice for programmers + (it's a power of 2 and allows to display 8/16 bit signed variables without + loosing columns) the plan is to move towards using only spaces in the source. +\end_layout + +\begin_layout Subsection +Building SDCC Using Microsoft Visual C++ 2010 (MSVC) +\end_layout + +\begin_layout Standard + +\series medium +Download the source package +\series default + either from the SDCC Subversion repository or from the snapshot builds + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + + +\series medium +, it will be named something like sdcc +\series default +-src +\series medium +-yyyymmdd-rrrr.tar.bz2. + +\series default + SDCC is distributed with all the project, solution and other files you + need to build it using Visual C++ 2010 (except for ucSim). + The solution name is 'sdcc.sln'. + Please note that as it is now, all the executables are created in a folder + called sdcc +\backslash +bin_vc. + Once built you need to copy the executables from sdcc +\backslash +bin_vc to sdcc +\backslash +bin before running SDCC. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Apart from the SDCC sources you also need to have the BOOST libraries installed + for MSVC. + Get it here +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.boost.org/ +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +In order to build SDCC with MSVC you need win32 executables of bison.exe, + flex.exe, and gawk.exe. + One good place to get them is here +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://unxutils.sourceforge.net +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +If UnxUtils didn't work well, +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +msys +\end_layout + +\end_inset + +msys ( +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.mingw.org/wiki/msys +\end_layout + +\end_inset + +) or msys2 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +msys2 +\end_layout + +\end_inset + +( +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +https://msys2.github.io +\end_layout + +\end_inset + +) can be an alternative. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Download the file UnxUtils +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +UnxUtils +\end_layout + +\end_inset + +.zip. + Now you have to install the utilities and setup MSVC so it can locate the + required programs. + Here there are two alternatives (choose one!): +\end_layout + +\begin_layout Enumerate +The easy way: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +a) Extract UnxUtils.zip to your C: +\backslash + hard disk PRESERVING the original paths, otherwise bison won't work. + (If you are using WinZip make certain that 'Use folder names' is selected) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +b) Add 'C: +\backslash +user +\backslash +local +\backslash +wbin' to VC++ Directories / Executable Directories. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +(As a side effect, you get a bunch of Unix utilities that could be useful, + such as diff and patch.) +\end_layout + +\begin_layout Enumerate +A more compact way: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +This one avoids extracting a bunch of files you may not use, but requires + some extra work: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +a) Create a directory were to put the tools needed, or use a directory already + present. + Say for example 'C: +\backslash +util'. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +b) Extract 'bison.exe', 'bison.hairy', 'bison.simple', 'flex.exe', and gawk.exe + to such directory WITHOUT preserving the original paths. + (If you are using WinZip make certain that 'Use folder names' is not selected) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +c) Rename bison.exe to '_bison.exe'. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +d) Create a batch file 'bison.bat' in 'C: +\backslash +util +\backslash +' and add these lines: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +set BISON_SIMPLE=C: +\backslash +util +\backslash +bison.simple +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +set BISON_HAIRY=C: +\backslash +util +\backslash +bison.hairy +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_bison %1 %2 %3 %4 %5 %6 %7 %8 %9 +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Steps 'c' and 'd' are needed because bison requires by default that the + files 'bison.simple' and 'bison.hairy' reside in some weird Unix directory, + '/usr/local/share/' I think. + So it is necessary to tell bison where those files are located if they + are not in such directory. + That is the function of the environment variables BISON_SIMPLE and BISON_HAIRY. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +e) Add 'C: +\backslash +util' to VC++ Directories / Executable Directories. + Note that you can use any other path instead of 'C: +\backslash +util', even the path where the Visual C++ tools are, probably: 'C: +\backslash +Program Files +\backslash +Microsoft Visual Studio +\backslash +Common +\backslash +Tools'. + So you don't have to execute step 'e' :) +\end_layout + +\begin_layout Standard +That is it. + Open 'sdcc.sln' in Visual Studio, click 'build all', when it finishes copy + the executables from sdcc +\backslash +bin_vc to sdcc +\backslash +bin, and you can compile using SDCC. +\end_layout + +\begin_layout Subsection +Windows Install Using a ZIP Package +\end_layout + +\begin_layout Enumerate +Download the binary zip package from +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sf.net/snap.php +\end_layout + +\end_inset + + and unpack it using your favorite unpacking tool (gunzip, WinZip, etc). + This should unpack to a group of sub-directories. + An example directory structure after unpacking the mingw32 package is: + C: +\backslash +sdcc +\backslash +bin for the executables, C: +\backslash +sdcc +\backslash +include and C: +\backslash +sdcc +\backslash +lib for the include and libraries. +\end_layout + +\begin_layout Enumerate +Adjust your environment variable PATH to include the location of the bin + directory or start sdcc using the full path. +\end_layout + +\begin_layout Subsection +Windows Install Using the Setup Program +\begin_inset CommandInset label +LatexCommand label +name "subsec:Windows-Install" + +\end_inset + + +\end_layout + +\begin_layout Standard +Download the setup program +\emph on +sdcc-x.y.z-setup.exe +\emph default + for an official release from +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/sdcc/files/ +\end_layout + +\end_inset + + or a setup program for one of the snapshots +\emph on +sdcc-yyyymmdd-xxxx-setup.exe +\emph default + from +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + + and execute it. + A windows typical installer will guide you through the installation process. +\end_layout + +\begin_layout Subsection +VPATH +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +VPATH +\end_layout + +\end_inset + + feature +\end_layout + +\begin_layout Standard +SDCC supports the VPATH feature provided by configure and make. + It allows to separate the source and build trees. + Here's an example: +\end_layout + +\begin_layout Standard + +\family typewriter +cd ~ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +# cd $HOME +\end_layout + +\begin_layout Standard + +\family typewriter +tar -xjf sdcc-src-yyyymmdd-rrrr.tar.bz2 +\begin_inset space ~ +\end_inset + +# extract source to directory sdcc +\end_layout + +\begin_layout Standard + +\family typewriter +mkdir sdcc.build +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +# put output in sdcc.build +\end_layout + +\begin_layout Standard + +\family typewriter +cd sdcc.build +\end_layout + +\begin_layout Standard + +\family typewriter +../sdcc/configure +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +# configure is doing all the magic! +\end_layout + +\begin_layout Standard + +\family typewriter +make +\end_layout + +\begin_layout Standard +\noindent +That's it! +\series bold +configure +\series default + will create the directory tree will all the necessary Makefiles in ~/sdcc.build. + It automagically computes the variables srcdir, top_srcdir and top_buildir + for each directory. + After running +\series bold +make +\series default + the generated files will be in ~/sdcc.build, while the source files stay + in ~/sdcc. +\begin_inset Newline newline +\end_inset + +This is not only usefull for building different binaries, e.g. + when cross compiling. + It also gives you a much better overview in the source tree when all the + generated files are not scattered between the source files. + And the best thing is: if you want to change a file you can leave the original + file untouched in the source directory. + Simply copy it to the build directory, edit it, enter `make clean', `rm + Makefile.dep' and `make'. + +\series bold +make +\series default + will do the rest for you! +\end_layout + +\begin_layout Section +Building the Documentation +\end_layout + +\begin_layout Standard +Add - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-enable-doc to the configure arguments to build the documentation together + with all the other stuff. + You will need several tools (\SpecialChar LyX +, \SpecialChar LaTeX +, \SpecialChar LaTeX +2HTML, pdflatex, dvipdf, dvips and makeindex) + to get the job done. + Another possibility is to change to the doc directory and to type +\family sans +\series bold + +\begin_inset Quotes srd +\end_inset + +make +\begin_inset Quotes srd +\end_inset + + +\family default +\series default + there. + You're invited to make changes and additions to this manual (sdcc/doc/sdccman.ly +x). + Using \SpecialChar LyX + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.lyx.org +\end_layout + +\end_inset + + as editor is straightforward. + Prebuilt documentation is available from +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +Reading the Documentation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Documentation +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Currently reading the document in pdf format is recommended, as for unknown + reason the hyperlinks are working there whereas in the html version they + are not +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +If you should know why please drop us a note +\end_layout + +\end_inset + +. +\begin_inset Newline newline +\end_inset + +You'll find the pdf version +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PDF version of this document +\end_layout + +\end_inset + + at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/doc/sdccman.pdf +\end_layout + +\end_inset + +. +\begin_inset Newline newline +\end_inset + +This documentation is in some aspects different from a commercial documentation: + +\end_layout + +\begin_layout Itemize +It tries to document SDCC for several processor architectures in one document + (commercially these probably would be separate documents/products). + This document +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Status of documentation +\end_layout + +\end_inset + + currently matches SDCC for mcs51 and DS390 best and does give too few informati +on about f.e. + Z80, PIC14, PIC16 and HC08. +\end_layout + +\begin_layout Itemize +There are many references pointing away from this documentation. + Don't let this distract you. + If there f.e. + was a reference like +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.opencores.org +\end_layout + +\end_inset + + together with a statement +\begin_inset Quotes sld +\end_inset + +some processors which are targeted by SDCC can be implemented in a +\emph on +f +\emph default +ield +\emph on +p +\emph default +rogrammable +\emph on +g +\emph default +ate +\emph on +a +\emph default +rray +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +FPGA (field programmable gate array) +\end_layout + +\end_inset + + +\begin_inset Quotes srd +\end_inset + + or +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/fpgac/ +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +FpgaC ((subset of) C to FPGA compiler) +\end_layout + +\end_inset + + +\begin_inset Quotes sld +\end_inset + +have you ever heard of an open source compiler that compiles a subset of + C for an FPGA? +\begin_inset Quotes srd +\end_inset + + we expect you to have a quick look there and come back. + If you read this you are on the right track. +\end_layout + +\begin_layout Itemize +Some sections attribute more space to problems, restrictions and warnings + than to the solution. +\end_layout + +\begin_layout Itemize +The installation section and the section about the debugger is intimidating. +\end_layout + +\begin_layout Itemize +There are still lots of typos and there are more different writing styles + than pictures. +\end_layout + +\begin_layout Section +Testing the SDCC Compiler +\begin_inset CommandInset label +LatexCommand label +name "sec:Testing-the-SDCC" + +\end_inset + + +\end_layout + +\begin_layout Standard +The first thing you should do after installing your SDCC compiler is to + see if it runs. + Type +\family sans +\series bold +"sdcc - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-version" +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +version +\end_layout + +\end_inset + + +\family default +\series default + at the prompt, and the program should run and output its version like: + +\begin_inset Newline newline +\end_inset + + +\family typewriter +SDCC : mcs51/z80/avr/ds390/pic16/pic14/ds400/hc08 2.5.6 #4169 (May 8 2006) + (UNIX) +\end_layout + +\begin_layout Standard +If it doesn't run, or gives a message about not finding sdcc program, then + you need to check over your installation. + Make sure that the sdcc bin directory is in your executable search path + defined by the PATH environment setting ( +\series medium +see +\series default + section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Install-Trouble-shooting" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\series medium +Install trouble-shooting for suggestions +\series default +). + Make sure that the sdcc program is in the bin folder, if not perhaps something + did not install correctly. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series medium +SDCC +\series default + is commonly installed as described in section +\begin_inset Quotes sld +\end_inset + +Install and search paths +\begin_inset Quotes srd +\end_inset + +. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series medium +Make sure the compiler works on a very simple example. + Type in the following test.c program using your favorite +\series default + ASCII +\series medium +editor: +\end_layout + +\begin_layout Verse + +\family typewriter +char test; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void main(void) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +test=0; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard + +\series medium +Compile this using the following command: +\series default + +\family sans +\series bold +"sdcc -c test.c". + +\family default +\series default + +\series medium +If all goes well, the compiler will generate a test.asm and test.rel file. + Congratulations, you've just compiled your first program with SDCC. + We used the -c option to tell SDCC not to link the generated code, just + to keep things simple for this step. +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series medium +The next step is to try it with the linker. + Type in +\series default + +\family sans +\series bold +"sdcc test.c +\family default +\series default +" +\series medium +. + If all goes well the compiler will link with the libraries and produce + a test.ihx output file. + If this step fails +\series default + +\series medium +(no test.ihx, and the linker generates warnings), then the problem is most + likely that +\series default + SDCC +\series medium +cannot find the +\series default + / +\series medium +usr/local/share/sdcc/lib directory +\series default + +\series medium +(see +\series default + section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Install-Trouble-shooting" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\series medium +Install trouble-shooting for suggestions). +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series medium +The final test is to ensure +\series default + SDCC +\series medium +can use the +\series default + standard +\series medium +header files and libraries. + Edit test.c and change it to the following: +\end_layout + +\begin_layout Verse + +\family typewriter +#include <string.h> +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +char str1[10]; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void main(void) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +strcpy(str1, "testing"); +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard + +\series medium +Compile this by typing +\series default + +\family sans +\series bold +"sdcc test.c" +\family default +\series medium +. + This should generate a test.ihx output file, and it should give no warnings + such as not finding the string.h file. + If it cannot find the string.h file, then the problem is that +\series default + SDCC +\series medium +cannot find the /usr/local/share/sdcc/include directory +\series default + +\series medium +(see the +\series default + section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Install-Trouble-shooting" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\series medium +Install trouble-shooting section for suggestions). + +\series default + Use option +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-print-search-dirs +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-print-search-dirs +\end_layout + +\end_inset + + to find exactly where SDCC is looking for the include and lib files. +\end_layout + +\begin_layout Section +Install Trouble-shooting +\begin_inset CommandInset label +LatexCommand label +name "subsec:Install-Trouble-shooting" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Install trouble-shooting +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +If SDCC does not build correctly +\end_layout + +\begin_layout Standard +A thing to try is starting from scratch by unpacking the .tgz source package + again in an empty directory. + Configure it like: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +./configure 2>&1 | tee configure.log +\family default +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +and build it like: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +make 2>&1 | tee make.log +\family default +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +If anything goes wrong, you can review the log files to locate the problem. + Or a relevant part of this can be attached to an email that could be helpful + when requesting help from the mailing list. +\end_layout + +\begin_layout Subsection +What the +\begin_inset Quotes sld +\end_inset + +./configure +\begin_inset Quotes srd +\end_inset + + does +\end_layout + +\begin_layout Standard +The +\begin_inset Quotes sld +\end_inset + +./configure +\begin_inset Quotes srd +\end_inset + + command is a script that analyzes your system and performs some configuration + to ensure the source package compiles on your system. + It will take a few minutes to run, and will compile a few tests to determine + what compiler features are installed. +\end_layout + +\begin_layout Subsection +What the +\begin_inset Quotes sld +\end_inset + +make +\begin_inset Quotes srd +\end_inset + + does +\end_layout + +\begin_layout Standard +This runs the GNU make tool, which automatically compiles all the source + packages into the final installed binary executables. +\end_layout + +\begin_layout Subsection +What the +\begin_inset Quotes sld +\end_inset + +make install +\begin_inset Quotes erd +\end_inset + + command does. +\end_layout + +\begin_layout Standard +This will install the compiler, other executables libraries and include + files into the appropriate directories. + See sections +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Install-paths" + +\end_inset + +, +\begin_inset space ~ +\end_inset + + +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Search-Paths" + +\end_inset + + +\begin_inset space ~ +\end_inset + +about install and search paths. +\begin_inset Newline newline +\end_inset + +On most systems you will need super-user privileges to do this. +\end_layout + +\begin_layout Section +Components of SDCC +\end_layout + +\begin_layout Standard +SDCC is not just a compiler, but a collection of tools by various developers. + These include linkers, assemblers, simulators and other components. + Here is a summary of some of the components. + Note that the included simulator and assembler have separate documentation + which you can find in the source package in their respective directories. + As SDCC grows to include support for other processors, other packages from + various developers are included and may have their own sets of documentation. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +You might want to look at the files which are installed in <installdir>. + At the time of this writing, we find the following programs for gcc-builds: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +In <installdir>/bin: +\end_layout + +\begin_layout Itemize +sdcc - The compiler. +\end_layout + +\begin_layout Itemize +sdcpp - The C preprocessor. +\end_layout + +\begin_layout Itemize +sdas8051 - The assembler for 8051 type processors. +\end_layout + +\begin_layout Itemize +sdas390 - The assembler for DS80C390 processor. +\end_layout + +\begin_layout Itemize +sdasz80 +\series bold +, +\series default + sdasgb - The Z80 and GameBoy Z80 assemblers. +\end_layout + +\begin_layout Itemize +sdas6808 - The 6808 assembler. +\end_layout + +\begin_layout Itemize +sdasstm8 - The STM8 assembler. +\end_layout + +\begin_layout Itemize +sdld -The linker for 8051 and STM8 type processors. +\end_layout + +\begin_layout Itemize +sdldz80 +\series bold +, +\series default + sdldgb - The Z80 and GameBoy Z80 linkers. +\end_layout + +\begin_layout Itemize +sdld6808 - The 6808 linker. +\end_layout + +\begin_layout Itemize +s51 - The ucSim 8051 simulator. +\end_layout + +\begin_layout Itemize +sz80 - The ucSim Z80 simulator. +\end_layout + +\begin_layout Itemize +shc08 - The ucSim 6808 simulator. +\end_layout + +\begin_layout Itemize +sstm8 - The ucSim STM8 simulator. +\end_layout + +\begin_layout Itemize +sdcdb - The source debugger. +\end_layout + +\begin_layout Itemize +sdar, sdranlib, sdnm, sdobjcopy - The sdcc archive managing and indexing + utilites. +\end_layout + +\begin_layout Itemize +packihx - A tool to pack (compress) Intel hex files. +\end_layout + +\begin_layout Itemize +makebin - A tool to convert Intel Hex file to a binary and GameBoy binary + image file format. +\end_layout + +\begin_layout Standard +In <installdir>/share/sdcc/include +\end_layout + +\begin_layout Itemize +the include files +\end_layout + +\begin_layout Standard +In <installdir>/share/sdcc/non-free/include +\end_layout + +\begin_layout Itemize +the non-free include files +\end_layout + +\begin_layout Standard +In <installdir>/share/sdcc/lib +\end_layout + +\begin_layout Itemize +the src and target subdirectories with the precompiled relocatables. +\end_layout + +\begin_layout Standard +In <installdir>/share/sdcc/non-free/lib +\end_layout + +\begin_layout Itemize +the src and target subdirectories with the non-free precompiled relocatables. +\end_layout + +\begin_layout Standard +In <installdir>/share/sdcc/doc +\end_layout + +\begin_layout Itemize +the documentation +\end_layout + +\begin_layout Subsection +sdcc - The Compiler +\end_layout + +\begin_layout Standard +This is the actual compiler, it in turn uses the c-preprocessor and invokes + the assembler and linkage editor. +\end_layout + +\begin_layout Subsection +sdcpp - The C-Preprocessor +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Preprocessor +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The preprocessor +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdcpp (preprocessor) +\end_layout + +\end_inset + + is a modified version of the GNU cpp +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +cpp|see +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + +{ +\end_layout + +\end_inset + +sdcpp +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + preprocessor +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://gcc.gnu.org/ +\end_layout + +\end_inset + +. + The C preprocessor is used to pull in #include sources, process #ifdef + statements, #defines and so on. +\end_layout + +\begin_layout Subsection +sdas, sdld - The Assemblers and Linkage Editors +\end_layout + +\begin_layout Standard +This is a set of retargettable assemblers and linkage editors, which was + developed by Alan Baldwin. + John Hartman created the version for 8051, and I (Sandeep) have made some + enhancements and bug fixes for it to work properly with SDCC. + +\end_layout + +\begin_layout Standard +SDCC used an about 1998 branch of asxxxx version 2.0 which unfortunately + is not compatible with the more advanced (f.e. + macros, more targets) ASxxxx Cross Assemblers nowadays available from Alan + Baldwin +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://shop-pdp.kent.edu/ +\end_layout + +\end_inset + +. + In 2009 Alan made his ASxxxx Cross Assemblers version 5.0 available under + the GPL license (GPLv3 or later), so a reunion is now a work in progress. + Thanks Alan! +\end_layout + +\begin_layout Subsection +s51, sz80, shc08, sstm8 - The Simulators +\end_layout + +\begin_layout Standard +s51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +s51 (simulator) +\end_layout + +\end_inset + +, sz80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sz80 (simulator) +\end_layout + +\end_inset + + shc08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +shc08 (simulator) +\end_layout + +\end_inset + + and sstm8 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sstm8 (simulator) +\end_layout + +\end_inset + + are free open source simulators developed by Daniel Drotos. + The simulators are built as part of the build process. + For more information visit Daniel's web site at: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51 +\end_layout + +\end_inset + +. + It currently supports the core mcs51, the Dallas DS80C390, the Phillips + XA51 family, the Z80, 6808 and the STM8. +\end_layout + +\begin_layout Subsection +sdcdb - Source Level Debugger +\end_layout + +\begin_layout Standard +SDCDB +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCDB (debugger) +\end_layout + +\end_inset + + is the companion source level debugger. + More about SDCDB in section +\begin_inset CommandInset ref +LatexCommand ref +reference "cha:Debugging-with-SDCDB" + +\end_inset + +. + The current version of the debugger uses Daniel's Simulator S51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +s51 (simulator) +\end_layout + +\end_inset + +, but can be easily changed to use other simulators. +\end_layout + +\begin_layout Chapter +Using SDCC +\end_layout + +\begin_layout Section +Standard-Compliance +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Standard-compliance +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "subsec:Standard-Compliance" + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC aims to be a conforming freestanding implementation of the C programming + language. + +\end_layout + +\begin_layout Subsection +ISO C90 and ANSI C89 +\end_layout + +\begin_layout Standard +Use +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + to compile in this mode. +\end_layout + +\begin_layout Standard +The latest publicly available version of the standard +\emph on +ISO/IEC 9899 - Programming languages - C +\emph default + should be available at: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899 +\end_layout + +\end_inset + +. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +Deviations from standard compliance: +\end_layout + +\begin_layout Itemize +structures +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +struct +\end_layout + +\end_inset + + and unions +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +union +\end_layout + +\end_inset + + cannot be passed as function parameters and cannot be a return value +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +return value +\end_layout + +\end_inset + + from a function, e.g.: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Verse + +\family typewriter +struct s { ... + }; +\begin_inset Newline newline +\end_inset + + +\series bold +struct +\family default +\series default + +\family typewriter +s foo1 ( +\series bold +struct +\family default +\series default + +\family typewriter +s parms) /* invalid in SDCC although allowed in ANSI */ +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +struct s rets; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return rets; /* is invalid in SDCC although allowed in ANSI */ +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\end_deeper +\begin_layout Itemize +initialization of structure arrays must be fully braced. +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Verse + +\family typewriter +struct s { char x } a[] = {1, 2}; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* invalid in SDCC */ +\begin_inset Newline newline +\end_inset + +struct s { char x } a[] = {{1}, {2}}; /* OK */ +\end_layout + +\end_deeper +\begin_layout Itemize +'double +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +double (not supported) +\end_layout + +\end_inset + +' precision floating point +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Floating point support +\end_layout + +\end_inset + +not supported. + Instead a warning is emitted, and float is used instead. + long double is not supported. +\end_layout + +\begin_layout Itemize +Old K&R style +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +K +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +& +\end_layout + +\end_inset + +R style +\end_layout + +\end_inset + + function declarations are not supported. +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Verse + +\family typewriter +foo(i,j) /* this old style of function declarations */ +\begin_inset Newline newline +\end_inset + +int i,j; /* is valid in ANSI but not valid in SDCC */ +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... + +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\end_deeper +\begin_layout Standard +Some features of this standard are not supported in some ports: +\end_layout + +\begin_layout Itemize +Functions are not reentrant unless explicitly declared as such or +\series bold + +\begin_inset Flex Code +status open + +\begin_layout Plain Layout + +\series bold +-- +\series default +stack-auto +\end_layout + +\end_inset + + +\series default + is specified in the mcs51, ds390, hc08 and s08 ports. +\end_layout + +\begin_layout Subsection +ISO C95 +\end_layout + +\begin_layout Standard +Use +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c95 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c95 +\end_layout + +\end_inset + + +\series default + to compile in this mode. +\end_layout + +\begin_layout Standard +Except for the issues mentioned in the section above, this standard is supported. +\end_layout + +\begin_layout Subsection +ISO C99 +\end_layout + +\begin_layout Standard +Use +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\end_layout + +\end_inset + + +\series default + to compile in this mode. +\end_layout + +\begin_layout Standard +In addition to what is mentioned in the section above, the following features + of this standard are not supported by SDCC: +\end_layout + +\begin_layout Itemize +Compound literals. + +\end_layout + +\begin_layout Itemize +Variable-length arrays. +\end_layout + +\begin_layout Standard +Some features of this standard are not supported in some ports: +\end_layout + +\begin_layout Itemize +There is no support for data types long long, unsigned long long, int_fast64_t, + int_least64_t, int64_t, uint_fast64_t, uint_least64_t, uint64_t in the + pic14 and pic16 ports. + +\end_layout + +\begin_layout Subsection +ISO C11 and ISO C17 +\end_layout + +\begin_layout Standard +Use +\series bold +- +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c11 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c11 +\end_layout + +\end_inset + + +\series default + to compile in this mode. +\end_layout + +\begin_layout Standard +Except for the issues mentioned in the section above, this standard is supported. +\end_layout + +\begin_layout Subsection +ISO C2X +\end_layout + +\begin_layout Standard +Use +\series bold +- +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c2x +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c2x +\end_layout + +\end_inset + + +\series default + to compile in this mode. +\end_layout + +\begin_layout Standard +Standard and support are still quite incomplete. +\end_layout + +\begin_layout Subsection +Embedded C +\end_layout + +\begin_layout Standard +SDCC supports named address spaces. + The support for fixed-point math in SDCC is inconsistent with the standard. + Other parts of the standard are not supported. +\end_layout + +\begin_layout Section +Compiling +\end_layout + +\begin_layout Subsection +Single Source File Projects +\end_layout + +\begin_layout Standard +For single source file 8051 projects the process is very simple. + Compile your programs with the following command +\family sans +\series bold +"sdcc sourcefile.c". + +\family default +\series default + This will compile, assemble and link your source file. + Output files are as follows: +\end_layout + +\begin_layout Itemize +sourcefile.asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.asm +\end_layout + +\end_inset + + - Assembler source +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler source +\end_layout + +\end_inset + + file created by the compiler +\end_layout + +\begin_layout Itemize +sourcefile.lst +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.lst +\end_layout + +\end_inset + + - Assembler listing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler listing +\end_layout + +\end_inset + + file created by the Assembler +\end_layout + +\begin_layout Itemize +sourcefile.rst +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.rst +\end_layout + +\end_inset + + - Assembler listing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler listing +\end_layout + +\end_inset + + file updated with linkedit information, created by linkage editor +\end_layout + +\begin_layout Itemize +sourcefile.sym +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.sym +\end_layout + +\end_inset + + - symbol listing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Symbol listing +\end_layout + +\end_inset + + for the sourcefile, created by the assembler +\end_layout + +\begin_layout Itemize +sourcefile.rel +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.rel +\end_layout + +\end_inset + + - Object file +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Object file +\end_layout + +\end_inset + + created by the assembler, input to Linkage editor +\end_layout + +\begin_layout Itemize +sourcefile.map +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.map +\end_layout + +\end_inset + + - The memory map +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory map +\end_layout + +\end_inset + + for the load module, created by the Linker +\end_layout + +\begin_layout Itemize +sourcefile.mem +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.mem +\end_layout + +\end_inset + + - A file with a summary of the memory usage +\end_layout + +\begin_layout Itemize +sourcefile.ihx +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.ihx +\end_layout + +\end_inset + + - The load module in Intel hex format +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Intel hex format +\end_layout + +\end_inset + + (you can select the Motorola S19 format +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Motorola S19 format +\end_layout + +\end_inset + + with - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-s19 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-s19 +\end_layout + +\end_inset + +. + If you need another format you might want to use +\family sans +\shape italic +objdump +\family default +\shape default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +objdump (tool) +\end_layout + +\end_inset + + or +\family sans +\shape italic +srecord +\family default +\shape default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +srecord (bin, hex, ... + tool) +\end_layout + +\end_inset + + +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +hyperlinks needed +\end_layout + +\end_inset + + - see also section +\begin_inset CommandInset ref +LatexCommand vref +reference "subsec:Postprocessing-the-Intel" + +\end_inset + +). + Both formats are documented in the documentation of srecord +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +srecord (bin, hex, ... + tool) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize +sourcefile.adb +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.adb +\end_layout + +\end_inset + + - An intermediate file containing debug information needed to create the + .cdb file (with - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\end_layout + +\end_inset + +) +\end_layout + +\begin_layout Itemize +sourcefile.cdb +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.cdb +\end_layout + +\end_inset + + - An optional file (with - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug) containing debug information. + The format is documented in cdbfileformat.pdf +\end_layout + +\begin_layout Itemize +sourcefile.omf +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.omf +\end_layout + +\end_inset + + - An optional AOMF or AOMF51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +AOMF, AOMF51 +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "OMF file" + +\end_inset + +file containing debug information (generated with option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug). + The (Intel) +\emph on +a +\emph default +bsolute +\emph on +o +\emph default +bject +\emph on +m +\emph default +odule +\emph on +f +\emph default +ormat is a subformat of the OMF51 format and is commonly used by third party + tools (debuggers +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Debugger +\end_layout + +\end_inset + +, simulators, emulators). +\end_layout + +\begin_layout Itemize +sourcefile.dump* +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.dump* +\end_layout + +\end_inset + + - Dump file to debug the compiler it self (generated with option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dumpall) (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Intermediate-Dump-Options" + +\end_inset + + +\begin_inset space ~ +\end_inset + + and section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:The-anatomy-of" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset Quotes sld +\end_inset + +Anatomy of the compiler +\begin_inset Quotes srd +\end_inset + +). +\end_layout + +\begin_layout Subsection +Postprocessing the Intel Hex +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Intel hex format +\end_layout + +\end_inset + + file +\begin_inset CommandInset label +LatexCommand label +name "subsec:Postprocessing-the-Intel" + +\end_inset + + +\end_layout + +\begin_layout Standard +In most cases this won't be needed but the Intel Hex file +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.ihx +\end_layout + +\end_inset + + which is generated by SDCC might include lines of varying length and the + addresses within the file are not guaranteed to be strictly ascending. + If your toolchain or a bootloader does not like this you can use the tool + +\family typewriter +packihx +\family default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +packihx (tool) +\end_layout + +\end_inset + + which is part of the SDCC distribution: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +packihx sourcefile.ihx >sourcefile.hex +\family default +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The separately available +\emph on +srecord +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +srecord (bin, hex, ... + tool) +\end_layout + +\end_inset + + package additionally allows to set undefined locations to a predefined + value, to insert checksums +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +checksum +\end_layout + +\end_inset + + of various flavours (crc, add, xor) and to perform other manipulations + (convert, split, crop, offset, ...). + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +srec_cat +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sourcefile.ihx -intel +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +-o sourcefile.hex -intel +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +\series default +An example for a more complex command line +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +the command backfills +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +backfill unused memory +\end_layout + +\end_inset + + unused memory with 0x12 and the overall 16 bit sum of the complete 64 kByte + block is zero. + If the program counter on an mcs51 runs wild the backfill pattern 0x12 + will be interpreted as an +\family typewriter +lcall +\family default + to address +\family typewriter +0x1212 +\family default + (where an emergency routine could sit). +\end_layout + +\end_inset + + could look like: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +\size footnotesize +srec_cat +\begin_inset space ~ +\end_inset + +sourcefile.ihx -intel +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +-fill 0x12 0x0000 0xfffe +\begin_inset space ~ +\end_inset + +-little-endian-checksum-negative 0xfffe 0x02 0x02 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +-o sourcefile.hex -intel +\size default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +\series default +The srecord package is available at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/srecord/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Projects with Multiple Source Files +\end_layout + +\begin_layout Standard +SDCC can compile only ONE file at a time. + Let us for example assume that you have a project containing the following + files: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +foo1.c (contains some functions) +\begin_inset Newline newline +\end_inset + +foo2.c (contains some more functions) +\begin_inset Newline newline +\end_inset + +foomain.c (contains more functions and the function main) +\begin_inset Newline newline +\end_inset + + +\size footnotesize + +\begin_inset Newline newline +\end_inset + + +\size default +The first two files will need to be compiled separately with the commands: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcc +\begin_inset space ~ +\end_inset + +-c +\begin_inset space ~ +\end_inset + +foo1.c +\family default +\series default +\size footnotesize + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +\size default +sdcc +\begin_inset space ~ +\end_inset + +-c +\begin_inset space ~ +\end_inset + +foo2.c +\family default +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Then compile the source file containing the +\emph on +main() +\emph default + function and link +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Linker +\end_layout + +\end_inset + + the files together with the following command: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcc +\begin_inset space ~ +\end_inset + +foomain.c +\begin_inset space ~ +\end_inset + +foo1.rel +\begin_inset space ~ +\end_inset + +foo2.rel +\family default +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.rel +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Alternatively, +\emph on +foomain.c +\emph default + can be separately compiled as well: +\family sans +\series bold + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +sdcc +\begin_inset space ~ +\end_inset + +-c +\begin_inset space ~ +\end_inset + +foomain.c +\begin_inset Newline newline +\end_inset + +sdcc foomain.rel foo1.rel foo2.rel +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +\series default +The file containing the +\emph on +main() +\emph default + function +\noun on +must +\noun default + be the +\noun on +first +\noun default + file specified in the command line, since the linkage editor processes + file in the order they are presented to it. + The linker is invoked from SDCC using a script file with extension .lnk +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.lnk +\end_layout + +\end_inset + +. + You can view this file to troubleshoot linking problems such as those arising + from missing libraries. +\end_layout + +\begin_layout Subsection +Projects with Additional Libraries +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Libraries +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Some reusable routines may be compiled into a library, see the documentation + for the assembler and linkage editor (which are in <installdir>/share/sdcc/doc) + for how to create a +\emph on +.lib +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.lib +\end_layout + +\end_inset + + +\emph default + library file. + Libraries created in this manner can be included in the command line. + Make sure you include the -L <library-path> option to tell the linker where + to look for these files if they are not in the current directory. + Here is an example, assuming you have the source file +\emph on +foomain.c +\emph default + and a library +\emph on +foolib.lib +\emph default + in the directory +\emph on +mylib +\emph default + (if that is not the same as your current project): +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcc foomain.c foolib.lib -L mylib +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +\series default +Note here that +\emph on +mylib +\emph default + must be an absolute path name. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The most efficient way to use libraries is to keep separate modules in separate + source files. + The lib file now should name all the modules.rel +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.rel +\end_layout + +\end_inset + + files. + For an example see the standard library file +\emph on +libsdcc.lib +\emph default + in the directory <installdir>/share/lib/small. +\end_layout + +\begin_layout Subsection +Using sdar to Create and Manage Libraries +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdar +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "subsec:Using-sdar-to" + +\end_inset + + +\end_layout + +\begin_layout Standard +Support for sdar format libraries was introduced in SDCC 2.9.0. +\series bold + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series default +Both the GNU and BSD ar format variants are supported by sdld linkers. +\series bold + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series default +To create a library containing sdas object files, you should use the following + sequence: +\series bold + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard + +\family sans +\series bold +sdar -rc <library name>.lib <list of .rel files> +\end_layout + +\begin_layout Section +Command Line Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Command Line Options +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "sec:Command-Line-Options" + +\end_inset + + +\end_layout + +\begin_layout Subsection +Processor Selection Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options processor selection +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Processor selection options +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mmcs51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mmcs51 +\end_layout + +\end_inset + + +\series default + Generate code for the Intel MCS51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MCS51 +\end_layout + +\end_inset + + family of processors. + This is the default processor target. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mds390 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mds390 +\end_layout + +\end_inset + + +\series default + Generate code for the Dallas DS80C390 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS80C390 +\end_layout + +\end_inset + + processor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mds400 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mds400 +\end_layout + +\end_inset + + +\series default + Generate code for the Dallas DS80C400 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS80C400 +\end_layout + +\end_inset + + processor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mhc08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mhc08 +\end_layout + +\end_inset + + +\series default + Generate code for the Freescale/Motorola HC08 (aka 68HC08) +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08 +\end_layout + +\end_inset + + family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-ms08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-ms08 +\end_layout + +\end_inset + + +\series default + Generate code for the Freescale/Motorola S08 (aka 68HCS08, HCS08, CS08) + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +S08 +\end_layout + +\end_inset + + family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mz80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mz80 +\end_layout + +\end_inset + + +\series default + Generate code for the Zilog Z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80 +\end_layout + +\end_inset + + family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mz180 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mz180 +\end_layout + +\end_inset + + +\series default + Generate code for the Zilog Z180 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z180 +\end_layout + +\end_inset + + family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mr2k +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mr2k +\end_layout + +\end_inset + + +\series default + Generate code for the Rabbit 2000 / Rabbit 3000 family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mr3ka +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mr3ka +\end_layout + +\end_inset + + +\series default + Generate code for the Rabbit 3000A family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mgbz80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mgbz80 +\end_layout + +\end_inset + + +\series default + Generate code for the LR35902 GameBoy Z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gbz80 (GameBoy Z80) +\end_layout + +\end_inset + + processor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mtlcs90 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +-mtlcs90 +\end_layout + +\end_inset + + +\series default + Generate code for the Toshiba TLCS-90 processor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mez80_z80 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +-mez80_z80 +\end_layout + +\end_inset + + +\series default + Generate code for the Zilog eZ80 processor in Z80 mode. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mstm8 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mstm8 +\end_layout + +\end_inset + + +\series default + Generate code for the STMicroelectronics STM8 family of processors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mpdk14 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +-mpdk14 +\end_layout + +\end_inset + + +\series default + Generate code for Padauk processors with 14 bit wide program memory. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mpdk15 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +-mpdk15 +\end_layout + +\end_inset + + +\series default + Generate code for Padauk processors with 15 bit wide program memory. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mpic14 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mpic14 +\end_layout + +\end_inset + + +\series default + Generate code for the Microchip PIC 14 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14 +\end_layout + +\end_inset + +-bit processors (p16f84 and variants. + In development, not complete). +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +p16f627 p16f628 p16f84 p16f873 p16f877? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-mpic16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-mpic16 +\end_layout + +\end_inset + + +\series default + Generate code for the Microchip PIC 16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + +-bit processors (p18f452 and variants. + In development, not complete). +\end_layout + +\begin_layout Standard +SDCC inspects the program name it was called with so the processor family + can also be selected by renaming the sdcc binary (to f.e. + z80-sdcc) or by calling SDCC from a suitable link. + Option -m has higher priority than setting from program name. +\end_layout + +\begin_layout Subsection +Preprocessor Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options preprocessor +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Preprocessor!Options +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdcpp (preprocessor) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC uses +\shape italic +sdcpp +\shape default +, an adapted version of the GNU Compiler Collection +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gcc (GNU Compiler Collection) +\end_layout + +\end_inset + + preprocessor +\emph on +cpp +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +cpp|see +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + +{ +\end_layout + +\end_inset + +sdcpp +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + ( +\emph on +gcc +\emph default + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://gcc.gnu.org/ +\end_layout + +\end_inset + +). + If you need more dedicated options than those listed below please refer + to the GCC +\begin_inset space ~ +\end_inset + +CPP +\begin_inset space ~ +\end_inset + +Manual at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.gnu.org/software/gcc/onlinedocs/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-I<path> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-I<path> +\end_layout + +\end_inset + + +\series default + The additional location where the preprocessor will look for <..h> or +\begin_inset Quotes eld +\end_inset + +..h +\begin_inset Quotes erd +\end_inset + + files. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-D<macro[=value]> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-D<macro[=value]> +\end_layout + +\end_inset + + +\series default + Command line definition of macros. + Passed to the preprocessor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-M +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-M +\end_layout + +\end_inset + + +\series default + Tell the preprocessor to output a rule suitable for make describing the + dependencies of each object file. + For each source file, the preprocessor outputs one make-rule whose target + is the object file name for that source file and whose dependencies are + all the files `#include'd in it. + This rule may be a single line or may be continued with ` +\backslash +'-newline if it is long. + The list of rules is printed on standard output instead of the preprocessed + C program. + `-M' implies `-E +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-E +\end_layout + +\end_inset + +'. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-C +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-C +\end_layout + +\end_inset + + +\series default + Tell the preprocessor not to discard comments. + Used with the `-E' option. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-MM +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-MM +\end_layout + +\end_inset + + +\series default +\size large + +\size default +Like `-M' but the output mentions only the user header files included with + `#include +\begin_inset Quotes eld +\end_inset + +file"'. + System header files included with `#include <file>' are omitted. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-Aquestion(answer) +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-Aquestion(answer) +\end_layout + +\end_inset + + +\series default + Assert the answer answer for question, in case it is tested with a preprocessor + conditional such as `#if #question(answer)'. + `-A-' disables the standard assertions that normally describe the target + machine. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-Umacro +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-Umacro +\end_layout + +\end_inset + + +\series default + Undefine macro macro. + `-U' options are evaluated after all `-D' options, but before any `-include' + and `-imacros' options. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-dM +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-dM +\end_layout + +\end_inset + + +\series default + Tell the preprocessor to output only a list of the macro definitions that + are in effect at the end of preprocessing. + Used with the `-E' option. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-dD +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-dD +\end_layout + +\end_inset + + +\series default + Tell the preprocessor to pass all macro definitions into the output, in + their proper sequence in the rest of the output. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-dN +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-dN +\end_layout + +\end_inset + + +\series default +\size large + +\size default +Like `-dD' except that the macro arguments and contents are omitted. + Only `#define name' is included in the output. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-pedantic-parse-number +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +pedantic +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-pedantic-parse-number +\end_layout + +\end_inset + + +\size large +\bar under + +\begin_inset CommandInset label +LatexCommand label +name "lyx:-pedantic-parse-number" + +\end_inset + + +\series default +\bar default + +\size default +Pedantic parse numbers so that situations like 0xfe-LO_B(3) are parsed properly + and the macro LO_B(3) gets expanded. + See also #pragma pedantic_parse_number +\begin_inset CommandInset ref +LatexCommand vpageref +reference "ite:pedantic_parse_number" + +\end_inset + + in section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Pragmas" + +\end_inset + + +\emph on +Note: this functionality is not in conformance with C99 standard! +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-Wp +\begin_inset space ~ +\end_inset + +preprocessorOption[,preprocessorOption] +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-Wp preprocessorOption[,preprocessorOption] +\end_layout + +\end_inset + +... + Pass the preprocessorOption to the preprocessor +\family typewriter +sdcpp +\family default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdcpp (preprocessor) +\end_layout + +\end_inset + +. + +\end_layout + +\begin_layout Subsection +Optimization Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options optimization +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Optimization options +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nogcse +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nogcse +\end_layout + +\end_inset + + +\series default + Will not do global common subexpression elimination, this option may be + used when the compiler creates undesirably large stack/data spaces to store + compiler temporaries ( +\emph on +s +\emph default +pill +\emph on +loc +\emph default +ations, sloc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sloc (spill location) +\end_layout + +\end_inset + +). + A warning message will be generated when this happens and the compiler + will indicate the number of extra bytes it allocated. + It is recommended that this option NOT be used, #pragma +\begin_inset space ~ +\end_inset + +nogcse +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nogcse +\end_layout + +\end_inset + + can be used to turn off global subexpression elimination +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Subexpression elimination +\end_layout + +\end_inset + + for a given function only. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noinvariant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noinvariant +\end_layout + +\end_inset + + +\series default + Will not do loop invariant optimizations, this may be turned off for reasons + explained for the previous option. + For more details of loop optimizations performed see Loop Invariants in + section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Loop-Optimizations" + +\end_inset + +. + It is recommended that this option NOT be used, #pragma +\begin_inset space ~ +\end_inset + +noinvariant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noinvariant +\end_layout + +\end_inset + + can be used to turn off invariant optimizations for a given function only. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noinduction +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noinduction +\end_layout + +\end_inset + + +\series default + Will not do loop induction optimizations, see section strength reduction + for more details. + It is recommended that this option is NOT used, #pragma +\begin_inset space ~ +\end_inset + +noinduction +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noinduction +\end_layout + +\end_inset + + can be used to turn off induction optimizations for a given function only. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noloopreverse +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noloopreverse +\end_layout + +\end_inset + + +\series default +\size large + +\size default +Will not do loop reversal +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Loop reversing +\end_layout + +\end_inset + +optimization. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series bold +nolabelopt +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nolabelopt +\end_layout + +\end_inset + +Will not optimize labels (makes the dumpfiles more readable). +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-xinit-opt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-xinit-opt +\end_layout + +\end_inset + + +\series default + Will not memcpy initialized data from code space into xdata space. + This saves a few bytes in code space if you don't have initialized data +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Variable initialization +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nooverlay +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nooverlay +\end_layout + +\end_inset + + +\series default + The compiler will not overlay parameters and local variables of any function, + see section Parameters and local variables for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-peep +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-peep +\end_layout + +\end_inset + + +\series default + Disable peep-hole optimization with built-in rules. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-file +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-file +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<filename> This option can be used to use additional rules to be used by + the peep hole optimizer. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Peephole-Optimizer" + +\end_inset + + +\begin_inset space ~ +\end_inset + +Peep Hole optimizations for details on how to write these rules. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-asm +\end_layout + +\end_inset + + +\series default + Pass the inline assembler code through the peep hole optimizer. + This can cause unexpected changes to inline assembler code, please go through + the peephole optimizer +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Peephole optimizer +\end_layout + +\end_inset + + rules defined in the source file tree '<target>/peeph.def' before using + this option. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-return +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-return +\end_layout + +\end_inset + + +\series default + Let the peep hole optimizer do return optimizations. + This is the default without +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series default +debug +\series bold + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\end_layout + +\end_inset + + +\series default +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-peep-return +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-peep-return +\end_layout + +\end_inset + + +\series default + Do not let the peep hole optimizer do return optimizations. + This is the default with +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series default +debug +\series bold + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\end_layout + +\end_inset + + +\series default +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-opt-code-speed +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-opt-code-speed +\end_layout + +\end_inset + + +\series default + The compiler will optimize code generation towards fast code, possibly + at the expense of code size. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-opt-code-size +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-opt-code-size +\end_layout + +\end_inset + + +\series default + The compiler will optimize code generation towards compact code, possibly + at the expense of code speed. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series bold +fomit-frame-pointer +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fomit-frame-pointer +\end_layout + +\end_inset + + Frame pointer will be omitted when the function uses no local variables. + On the z80-related ports this option will result in the frame pointer always + being omitted. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series bold +max-allocs-per-node +\series default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-max-allocs-per-node +\end_layout + +\end_inset + + Setting this to a high value will result in increased compilation time + and more optimized code being generated. + Setting it to lower values speed up compilation, but does not optimize + as much. + The default value is 3000. + This option currently only affects the hc08, s08, z80, z180, r2k, r3ka + and gbz80 ports. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series bold +nolospre +\series default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nolospre +\end_layout + +\end_inset + + Disable lospre. + lospre is an advanced redundancy elimination technique, essentially an + improved variant of global subexpression elimination. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series bold +allow-unsafe-read +\series default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-allow-unsafe-read +\end_layout + +\end_inset + + Allow optimizations to generate unsafe reads. + This will enable additional optimizations, but can result in spurious reads + from undefined memory addresses, which can be harmful if the target system + uses certain ways of doing memory-mapped I/O. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\series bold +nostdlibcall +\series default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdlibcall +\end_layout + +\end_inset + + Disable the optimization of calls to the standard library. +\end_layout + +\begin_layout Subsection +Other Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options other +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-v +\begin_inset space ~ +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-version +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-version +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-v +\end_layout + +\end_inset + + +\series default + displays the sdcc version. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-c +\begin_inset space ~ +\end_inset + +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-compile-only +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-compile-only +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-c +\end_layout + +\end_inset + + +\series default + will compile and assemble the source, but will not call the linkage editor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\series default + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series bold +-c1mode +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-c1mode +\end_layout + +\end_inset + + +\series default + reads the preprocessed source from standard input and compiles it. + The file name for the assembler output must be specified using the -o option. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-E +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-E +\end_layout + +\end_inset + + +\series default + Run only the C preprocessor +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Preprocessor +\end_layout + +\end_inset + +. + Preprocess all the C source files specified and output the results to standard + output. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-o +\begin_inset space ~ +\end_inset + +<path/file> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-o <path/file> +\end_layout + +\end_inset + + +\series default + The output path where everything will be placed or the file name used for + all generated output files. + If the parameter is a path, it must have a trailing slash (or backslash + for the Windows binaries) to be recognized as a path. + Note for Windows users: if the path contains spaces, it should be surrounded + by quotes. + The trailing backslash should be doubled in order to prevent escaping the + final quote, for example: +\emph on +-o +\begin_inset Quotes sld +\end_inset + +F: +\backslash +Projects +\backslash +test3 +\backslash +output 1 +\backslash + +\backslash + +\begin_inset Quotes srd +\end_inset + + +\emph default + or put after the final quote, for example: +\emph on +-o +\begin_inset Quotes sld +\end_inset + +F: +\backslash +Projects +\backslash +test3 +\backslash +output 1 +\begin_inset Quotes srd +\end_inset + + +\backslash + +\emph default +. + The path using slashes for directory delimiters can be used too, for example: + +\emph on +-o +\begin_inset Quotes sld +\end_inset + +F:/Projects/test3/output 1/ +\begin_inset Quotes srd +\end_inset + + +\emph default +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\end_inset + + +\series default +\size large + +\size default +All functions in the source file will be compiled as +\emph on +reentrant +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + +, i.e. + the parameters and local variables will be allocated on the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + +. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Parameters-and-Local-Variables" + +\end_inset + + Parameters and Local Variables for more details. + If this option is used all source files in the project should be compiled + with this option. + It automatically implies - +\series bold + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series default +-int-long-reent and - +\series bold + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series default +-float-reent. + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "lyx:--callee-saves-function1[,function2][,function3]..." + +\end_inset + +function1[,function2][,function3].... + +\series default + The compiler by default uses a caller saves convention for register saving + across function calls, however this can cause unnecessary register pushing + and popping when calling small functions from larger functions. + This option can be used to switch the register saving convention for the + function names specified. + The compiler will not save registers when calling these functions, no extra + code will be generated at the entry and exit (function prologue +\series bold + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function prologue +\end_layout + +\end_inset + + +\series default + and epilogue +\series bold + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function epilogue +\end_layout + +\end_inset + + +\series default +) for these functions to save and restore the registers used by these functions, + this can SUBSTANTIALLY reduce code and improve run time performance of + the generated code. + In the future the compiler (with inter procedural analysis) will be able + to determine the appropriate scheme to use for each function call. + DO NOT use this option for built-in functions such as _mulint..., if this + option is used for a library function the appropriate library function + needs to be recompiled with the same option. + If the project consists of multiple source files then all the source file + should be compiled with the same - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves option string. + Also see #pragma +\begin_inset space ~ +\end_inset + +callee_saves +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma callee +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +saves +\end_layout + +\end_inset + + +\begin_inset CommandInset ref +LatexCommand vpageref +reference "ite:callee_saves-function1[,function2[,function3...]]--" + +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-all-callee-saves +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-all-callee-saves +\end_layout + +\end_inset + + +\series default + Function of - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves will be applied to all functions by default. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\end_layout + +\end_inset + + +\series default +When this option is used the compiler will generate debug information. + The debug information collected in a file with .cdb extension can be used + with the SDCDB. + For more information see documentation for SDCDB. + Another file with a .omf extension contains debug information in AOMF or + AOMF51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +AOMF, AOMF51 +\end_layout + +\end_inset + + format which is commonly used by third party tools. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-S +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-S +\end_layout + +\end_inset + + +\series default +\size large + +\size default +Stop after the stage of compilation proper; do not assemble. + The output is an assembler code file for the input file specified. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\end_layout + +\end_inset + + +\series default + Integer (16 bit) and long (32 bit) libraries have been compiled as reentrant. + Note by default these libraries are compiled as non-reentrant. + See section Installation for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-cyclomatic +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-cyclomatic +\end_layout + +\end_inset + + +\series default +This option will cause the compiler to generate an information message for + each function in the source file. + The message contains some +\emph on +important +\emph default + information about the function. + The number of edges and nodes the compiler detected in the control flow + graph of the function, and most importantly the +\emph on +cyclomatic complexity +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Cyclomatic complexity +\end_layout + +\end_inset + + +\emph default + see section on Cyclomatic Complexity for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-float-reent +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-float-reent +\end_layout + +\end_inset + + +\series default + Floating point library is compiled as reentrant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + +. + See section Installation for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fsigned-char +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fsigned-char +\end_layout + +\end_inset + + +\series default + By default char is +\family typewriter +unsigned +\family default +. + To set the signess for characters to signed, use the option - +\series bold + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series default +-fsigned-char. + If this option is set and no signedness keyword (unsigned/signed) is given, + a char will be unsigned. + All other types are unaffected. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdinc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdinc +\end_layout + +\end_inset + + +\series default + This will prevent the compiler from passing on the default include path + to the preprocessor. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdlib +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nostdlib +\end_layout + +\end_inset + + +\series default + This will prevent the compiler from passing on the default library +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Libraries +\end_layout + +\end_inset + + path to the linker. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-verbose +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-verbose +\end_layout + +\end_inset + + +\series default + Shows the various actions the compiler is performing. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-V +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-V +\end_layout + +\end_inset + + +\series default + Shows the actual commands the compiler is executing. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-c-code-in-asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-c-code-in-asm +\end_layout + +\end_inset + + +\series default + Hides your ugly and inefficient c-code from the asm file, so you can always + blame the compiler :) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-peep-comments +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-peep-comments +\end_layout + +\end_inset + + +\series default + Don't include peep-hole comments in the generated asm files even if - +\series bold + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series default +-fverbose-asm option is specified. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-i-code-in-asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-i-code-in-asm +\end_layout + +\end_inset + + +\series default + Include i-codes in the asm file. + Sounds like noise but is helpful for debugging the compiler itself. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-less-pedantic +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +pedantic +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-less-pedantic +\end_layout + +\end_inset + + +\series default + +\begin_inset CommandInset label +LatexCommand label +name "lyx:--less-pedantic" + +\end_inset + + Disable some of the more pedantic warnings +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Warnings +\end_layout + +\end_inset + +. + For more details, see the less_pedantic pragma +\begin_inset CommandInset ref +LatexCommand vpageref +reference "ite:less_pedantic" + +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-warning +\begin_inset space ~ +\end_inset + +<nnnn> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-disable-warning +\end_layout + +\end_inset + + +\series default + Disable specific warning with number <nnnn>. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-Werror +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-Werror +\end_layout + +\end_inset + + +\series default + Treat all warnings as errors. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-print-search-dirs +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-print-search-dirs +\end_layout + +\end_inset + + +\series default + Display the directories in the compiler's search path +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-vc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-vc +\end_layout + +\end_inset + + +\series default + Display errors and warnings using MSVC style, so you can use SDCC with + the visual studio IDE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +IDE +\end_layout + +\end_inset + +. + With SDCC both offering a GCC-like (the default) and a MSVC-like +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MSVC output style +\end_layout + +\end_inset + + output style, integration into most programming editors should be straightforwa +rd. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-stdout +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-stdout +\end_layout + +\end_inset + + +\series default + Send errors and warnings to stdout instead of stderr. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-Wa +\begin_inset space ~ +\end_inset + +asmOption[,asmOption] +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-Wa asmOption[,asmOption] +\end_layout + +\end_inset + +... + Pass the asmOption to the assembler +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options assembler +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler options +\end_layout + +\end_inset + +. + See file sdcc/sdas/doc/asmlnk.txt for assembler options.cd +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc89 +\end_layout + +\end_inset + + +\series default + Generally follow the ANSI C89 / ISO C90 standard, but allow some SDCC behaviour + that conflicts with the standard. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c89 +\end_layout + +\end_inset + + +\series default + Follow the ANSI C89 / ISO C90 standard. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc99 +\end_layout + +\end_inset + + +\series default + Generally follow the ISO C99 standard, but allow some SDCC behaviour that + conflicts with the standard. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c99 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc99 +\end_layout + +\end_inset + + +\series default + Follow the ISO C99 standard. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc11 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc11 +\end_layout + +\end_inset + + +\series default + Generally follow the ISO C11 standard, but allow some SDCC behaviour that + conflicts with the standard (default). +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-c11 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-std-sdcc11 +\end_layout + +\end_inset + + +\series default + Follow the ISO C11 standard. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-codeseg +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-codeseg <Value> +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "lyx:-codeseg" + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Name> The name to be used for the code +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +code +\end_layout + +\end_inset + + segment, default CSEG. + This is useful if you need to tell the compiler to put the code in a special + segment so you can later on tell the linker to put this segment in a special + place in memory. + Can be used for instance when using bank switching to put the code in a + bank. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-constseg +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-constseg <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Name> The name to be used for the const +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +const +\end_layout + +\end_inset + + segment, default CONST. + This is useful if you need to tell the compiler to put the const data in + a special segment so you can later on tell the linker to put this segment + in a special place in memory. + Can be used for instance when using bank switching to put the const data + in a bank. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fdollars-in-identifiers +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fdollars-in-identifiers +\end_layout + +\end_inset + + +\series default + Permit '$' as an identifier character. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-more-pedantic +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-more-pedantic +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +pedantic +\end_layout + +\end_inset + + Actually this is +\series bold +\emph on +not +\series default +\emph default + a SDCC compiler option but if you want +\emph on +more +\emph default + warnings you can use a separate tool dedicated to syntax checking like + splint +\begin_inset CommandInset label +LatexCommand label +name "lyx:more-pedantic-SPLINT" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +lint (syntax checking tool) +\end_layout + +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.splint.org +\end_layout + +\end_inset + +. + To make your source files parseable by splint you will have to include + +\family sans +lint.h +\family default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +splint (syntax checking tool) +\end_layout + +\end_inset + + in your source file and add brackets around extended keywords (like +\family sans + +\begin_inset Quotes sld +\end_inset + +__at +\begin_inset space ~ +\end_inset + + +\series bold +( +\series default +0xab +\series bold +) +\series default + +\begin_inset Quotes srd +\end_inset + + +\family default + and +\family sans + +\begin_inset Quotes sld +\end_inset + +__interrupt +\begin_inset space ~ +\end_inset + +(2) +\begin_inset Quotes srd +\end_inset + + +\family default +). + +\begin_inset Newline newline +\end_inset + +Splint has an excellent on line manual at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.splint.org/manual/ +\end_layout + +\end_inset + + and it's capabilities go beyond pure syntax checking. + You'll need to tell splint the location of SDCC's include files so a typical + command line could look like this: +\begin_inset Newline newline +\end_inset + + +\family sans +splint +\begin_inset space ~ +\end_inset + +-I +\begin_inset space ~ +\end_inset + +/usr/local/share/sdcc/include/mcs51/ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +myprogram.c +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "lyx:--use-non-free" + +\end_inset + + Search / include non-free licensed libraries and header files, located + under the non-free directory - see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Search-Paths" + +\end_inset + + +\end_layout + +\begin_layout Subsection +Linker Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options linker +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Linker options +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\series default + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series bold +-lib-path +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-lib-path <path> +\end_layout + +\end_inset + + +\series default + +\begin_inset space ~ +\end_inset + +<absolute path to additional libraries> This option is passed to the linkage + editor's additional libraries +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Libraries +\end_layout + +\end_inset + + search path. + The path name must be absolute. + Additional library files may be specified in the command line. + See section Compiling programs for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-L +\begin_inset space ~ +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-L <path> +\end_layout + +\end_inset + + +\series default + +\begin_inset space ~ +\end_inset + +<absolute path to additional libraries> Same as above. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-loc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-loc <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Value> The start location of the external ram +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +xdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + +, default value is 0. + The value entered can be in Hexadecimal or Decimal format, e.g.: - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-loc 0x8000 or - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-loc 32768. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-loc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-loc <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Value> The start location of the code +\begin_inset Index idx +status open + +\begin_layout Plain Layout +code +\end_layout + +\end_inset + + segment, default value 0. + Note when this option is used the interrupt vector table +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt vector table +\end_layout + +\end_inset + + is also relocated to the given address. + The value entered can be in Hexadecimal or Decimal format, e.g.: - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-loc 0x8000 or - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-loc 32768. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Value> By default the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + is placed after the data segment for mcs51. + By using this option the stack can be placed anywhere in the internal memory + space of the mcs51. + The value entered can be in Hexadecimal or Decimal format, e.g. + - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc 0x20 or - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc 32. + Since the sp register is incremented before a push or call, the initial + sp will be set to one byte prior the provided value. + The provided value should not overlap any other memory areas such as used + register banks or the data segment and with enough space for the current + application. + The +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pack-iram +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pack-iram +\end_layout + +\end_inset + + option (which is now a default setting) will override this setting, so + you should also specify the +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pack-iram +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pack-iram +\end_layout + +\end_inset + + option if you need to manually place the stack. +\end_layout + +\begin_deeper +\begin_layout Standard +For stm8, by default the stack is placed at the device-specific reset value. + By using this option, the stack can be placed anywhere in the lower 16-bits + of the stm8 memory space. + This is particularly useful for working around the stack roll-over antifeature + present in some stm8 devices. +\end_layout + +\end_deeper +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack-loc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack-loc <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Value> By default the external stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +xstack +\end_layout + +\end_inset + + is placed after the __pdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + segment. + Using this option the xstack can be placed anywhere in the external memory + space of the 8051. + The value entered can be in Hexadecimal or Decimal format, e.g. + - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack-loc 0x8000 or - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc 32768. + The provided value should not overlap any other memory areas such as the + pdata or xdata segment and with enough space for the current application. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Value> The start location of the internal ram data +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +data (mcs51, ds390 named address space) +\end_layout + +\end_inset + + segment. + The value entered can be in Hexadecimal or Decimal format, eg. + - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc 0x20 or - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc 32. + (By default, the start location of the internal ram data segment is set + as low as possible in memory, taking into account the used register banks + and the bit segment at address 0x20. + For example if register banks 0 and 1 are used without bit variables, the + data segment will be set, if - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc is not used, to location 0x10.) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-idata-loc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-idata-loc <Value> +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + +<Value> The start location of the indirectly addressable internal ram +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +idata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + of the 8051, default value is 0x80. + The value entered can be in Hexadecimal or Decimal format, eg. + - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-idata-loc 0x88 or - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-idata-loc 136. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-bit-loc +\series default + +\begin_inset space ~ +\end_inset + +<Value> The start location of the bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +bit +\end_layout + +\end_inset + + addressable internal ram of the 8051. + This is +\emph on +not +\emph default + implemented yet. + Instead an option can be passed directly to the linker: -Wl +\begin_inset space ~ +\end_inset + +-bBSEG=<Value>. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-ihx +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-ihx +\end_layout + +\end_inset + + +\series default +The linker output (final object code) is in Intel Hex format. +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Intel hex format +\end_layout + +\end_inset + + This is the default option. + The format itself is documented in the documentation of srecord +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +srecord (bin, hex, ... + tool) +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-s19 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-s19 +\end_layout + +\end_inset + + +\series default +The linker output (final object code) is in Motorola S19 format +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Motorola S19 format +\end_layout + +\end_inset + +. + The format itself is documented in the documentation of srecord. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-elf +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-s19 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-out-fmt-elf +\end_layout + +\end_inset + + +\series default +The linker output (final object code) is in ELF format +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +ELF format +\end_layout + +\end_inset + +. + (Currently only supported for the HC08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08 +\end_layout + +\end_inset + + and S08 processors) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-Wl +\begin_inset space ~ +\end_inset + +linkOption[,linkOption] +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +-Wl linkOption[,linkOption] +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "lyx:-Wl option" + +\end_inset + +... + Pass the linkOption to the linker. + If a bootloader is used an option like +\begin_inset Quotes sld +\end_inset + +-Wl +\begin_inset space ~ +\end_inset + +-bCSEG=0x1000 +\begin_inset Quotes srd +\end_inset + + would be typical to set the start of the code segment. + Either use the double quotes around this option or use no space (e.g. + -Wl-bCSEG=0x1000). + See also #pragma constseg and #pragma codeseg in section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Pragmas" + +\end_inset + +. + File sdcc/sdas/doc/asmlnk.txt has more on linker options. +\end_layout + +\begin_layout Subsection +MCS51 Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options MCS51 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MCS51 options +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-small +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-small +\end_layout + +\end_inset + + +\series default +\size large + +\size default +Generate code for Small model programs, see section Memory Models for more + details. + This is the default model. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-medium +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-medium +\end_layout + +\end_inset + + +\series default + Generate code for Medium model programs, see section Memory Models for + more details. + If this option is used all source files in the project have to be compiled + with this option. + It must also be used when invoking the linker. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-large +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-large +\end_layout + +\end_inset + + +\series default + Generate code for Large model programs, see section Memory Models for more + details. + If this option is used all source files in the project have to be compiled + with this option. + It must also be used when invoking the linker. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-huge +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-huge +\end_layout + +\end_inset + + +\series default + Generate code for Huge model programs, see section Memory Models for more + details. + If this option is used all source files in the project have to be compiled + with this option. + It must also be used when invoking the linker. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\end_layout + +\end_inset + + +\series default + Uses a pseudo stack in the __pdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + area (usually the first 256 bytes in the external ram) for allocating variables + and passing parameters. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:External-Stack" + +\end_inset + + +\begin_inset space ~ +\end_inset + + External Stack for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-iram-size +\series default + +\begin_inset space ~ +\end_inset + +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-iram-size <Value> +\end_layout + +\end_inset + + Causes the linker to check if the internal ram usage is within limits of + the given value. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-size +\series default + +\begin_inset space ~ +\end_inset + +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-size <Value> +\end_layout + +\end_inset + + Causes the linker to check if the external ram usage is within limits of + the given value. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-size +\series default + +\begin_inset space ~ +\end_inset + +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-size <Value> +\end_layout + +\end_inset + + Causes the linker to check if the code memory usage is within limits of + the given value. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-size +\series default + +\begin_inset space ~ +\end_inset + +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-size <Value> +\end_layout + +\end_inset + + Causes the linker to check if there is at minimum <Value> bytes for stack. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pack-iram +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pack-iram +\end_layout + +\end_inset + + Causes the linker to use unused register banks for data variables and pack + data, idata and stack together. + This is the default and this option will probably be removed along with + the removal of - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pack-iram. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pack-iram +\series default + +\begin_inset space ~ +\end_inset + +(deprecated) +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pack-iram +\end_layout + +\end_inset + + Causes the linker to use old style for allocating memory areas. + This option is now deprecated and will be removed in future versions. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-acall-ajmp +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-acall-ajmp +\end_layout + +\end_inset + + Replaces the three byte instructions lcall/ljmp with the two byte instructions + acall/ajmp. + Only use this option if your code is in the same 2k block of memory. + You may need to use this option for some 8051 derivatives which lack the + lcall/ljmp instructions. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-ret-without-call +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-ret-without-call +\end_layout + +\end_inset + + Causes the code generator to insert an extra lcall or acall instruction + whenever it needs to use a ret instruction in a context other than a function + returning. + This option is needed when using the Infineon +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Infineon +\end_layout + +\end_inset + + XC800 series microcontrollers to keep its Memory Extension Stack balanced. +\end_layout + +\begin_layout Subsection +DS390 / DS400 Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options DS390 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-flat24 +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-flat24 +\end_layout + +\end_inset + + +\size large + +\size default +Generate 24-bit flat mode code. + This is the one and only that the ds390 code generator supports right now + and is default when using +\emph on +-mds390 +\emph default +. + See section Memory Models for more details. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-protect-sp-update +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-protect-sp-update +\end_layout + +\end_inset + + +\series default + disable interrupts during ESP:SP updates. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-10bit +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-10bit +\end_layout + +\end_inset + + Generate code for the 10 bit stack mode of the Dallas DS80C390 part. + This is the one and only that the ds390 code generator supports right now + and is default when using +\emph on +-mds390 +\emph default +. + In this mode, the stack is located in the lower 1K of the internal RAM, + which is mapped to 0x400000. + Note that the support is incomplete, since it still uses a single byte + as the stack pointer. + This means that only the lower 256 bytes of the potential 1K stack space + will actually be used. + However, this does allow you to reclaim the precious 256 bytes of low RAM + for use for the DATA and IDATA segments. + The compiler will not generate any code to put the processor into 10 bit + stack mode. + It is important to ensure that the processor is in this mode before calling + any re-entrant functions compiled with this option. + In principle, this should work with the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\end_inset + + +\emph default + option, but that has not been tested. + It is incompatible with the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\end_layout + +\end_inset + + +\emph default + option. + It also only makes sense if the processor is in 24 bit contiguous addressing + mode (see the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-flat24 option +\emph default +). +\series bold + +\begin_inset Note Note +status collapsed + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-8-bit - switches off the 10-bit mode +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-probe +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-probe +\end_layout + +\end_inset + + +\series default + insert call to function __stack_probe at each function prologue. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-tini-libid +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-tini-libid +\end_layout + +\end_inset + + +\series default + <nnnn> LibraryID used in -mTININative. + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-accelerator +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-accelerator +\end_layout + +\end_inset + + +\series default + generate code for DS390 Arithmetic Accelerator. + +\end_layout + +\begin_layout Subsection +Options common to all z80-related ports (z80, z180, r2k, r3ka, gbz80, tlcs90, + ez80_z80) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-std-crt0 +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-std-crt0 +\end_layout + +\end_inset + + When linking, skip the standard crt0.rel object file. + You must provide your own crt0.rel for your system when linking. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves-bc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves-bc +\end_layout + +\end_inset + + +\size large + +\size default +Force a called function to always save BC. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-codeseg +\series default + +\begin_inset space ~ +\end_inset + +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-codeseg <Value> +\end_layout + +\end_inset + + Use <Value> for the code segment name. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-constseg +\series default + +\begin_inset space ~ +\end_inset + +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-constseg <Value> +\end_layout + +\end_inset + + Use <Value> for the const segment name. +\end_layout + +\begin_layout Subsection +Z80 Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options Z80 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80 +\end_layout + +\end_inset + + (apply to z80, z180, r2k, r3ka, tlcs90, ez80_z80) +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-portmode= +\series default +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-portmode=<Value> +\end_layout + +\end_inset + + Determinate PORT I/O mode (<Value> is z80 or z180). +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-asm= +\series default +<Value> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-asm=<Value> +\end_layout + +\end_inset + + Define assembler name (<Value> is rgbds, sdasz80, isas or z80asm). +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-reserve-regs-iy +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-reserve-regs-iy +\end_layout + +\end_inset + + +\size large + +\size default +This option tells the compiler that it is not allowed to use register pair + iy. + The option can be useful for systems where iy is reserved for the OS. + This option is incompatible with - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fomit-frame-pointer. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-oldralloc +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-oldralloc +\end_layout + +\end_inset + + +\size large + +\size default +Use old register allocator. + The old register allocator is typically is faster than the current one, + but the current one generates better code. + This differences are the most noticeable, when a high value for - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-max-allocs-per-node is used. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fno-omit-frame-pointer +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fno-omit-frame-pointer +\end_layout + +\end_inset + + +\size large + +\size default +Never omit the frame pointer. +\end_layout + +\begin_layout Subsection +GBZ80 Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options GBZ80 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GBZ80 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-bo +\series default + +\begin_inset space ~ +\end_inset + +<Num> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GBZ80!Options!-bo <Num> +\end_layout + +\end_inset + + Use code bank <Num>. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +-ba +\series default + +\begin_inset space ~ +\end_inset + +<Num> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GBZ80!Options!-ba <Num> +\end_layout + +\end_inset + + Use data bank <Num>. +\end_layout + +\begin_layout Subsection +Intermediate Dump Options +\begin_inset CommandInset label +LatexCommand label +name "subsec:Intermediate-Dump-Options" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options intermediate dump +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Intermediate dump options +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The following options are provided for the purpose of retargetting and debugging + the compiler. + They provide a means to dump the intermediate code (iCode +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +iCode +\end_layout + +\end_inset + +) generated by the compiler in human readable form at various stages of + the compilation process. + More on iCodes see chapter +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:The-anatomy-of" + +\end_inset + + +\begin_inset Quotes srd +\end_inset + +The anatomy of the compiler +\begin_inset Quotes srd +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dum-ast +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dump-ast +\end_layout + +\end_inset + + +\series default + This option will cause the compiler to dump the abstract syntax tree to + the econsole. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dump-i-code +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dump-i-code +\end_layout + +\end_inset + + +\size large + +\series default +\size default +Will dump iCodes at various stages into files named +\emph on +<source filename>.dump<stage> +\emph default +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dump-graphs +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dump-graphs +\end_layout + +\end_inset + + +\size large + +\series default +\size default +Will dump internal representations as graphviz .dot files. + Depending on other options, this can include the control-flow graph at + lospre, insertion of bank selection instructions or register allocation + and the conflict graph and tree-decomposition at register allocation. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fverbose-asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-gen-comments +\end_layout + +\end_inset + + +\series default + Include code generator and peep-hole comments in the generated asm files. +\end_layout + +\begin_layout Subsection +Redirecting output on Windows Shells +\end_layout + +\begin_layout Standard +By default SDCC writes its error messages to +\begin_inset Quotes sld +\end_inset + +standard error +\begin_inset Quotes srd +\end_inset + +. + To force all messages to +\begin_inset Quotes sld +\end_inset + +standard output +\begin_inset Quotes srd +\end_inset + + use +\series bold +- +\series default +\emph on + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series bold +\emph default +- +\series default +use-stdout +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-stdout +\end_layout + +\end_inset + +. + Additionally, if you happen to have visual studio installed in your windows + machine, you can use it to compile your sources using a custom build and + the SDCC - +\emph on + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\emph default +-vc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-vc +\end_layout + +\end_inset + + option. + Something like this should work: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\series bold +c: +\backslash +sdcc +\backslash +bin +\backslash +sdcc.exe - +\series default +\emph on + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series bold +\emph default +-vc - +\series default +\emph on + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series bold +\emph default +-model-large -c $(InputPath) +\end_layout + +\begin_layout Section +Environment variables +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Environment variables +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC recognizes the following environment variables: +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +SDCC_LEAVE_SIGNALS +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LEAVE +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +SIGNALS +\end_layout + +\end_inset + + +\series default + SDCC installs a signal handler +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +signal handler +\end_layout + +\end_inset + + to be able to delete temporary files after an user break (^C) or an exception. + If this environment variable is set, SDCC won't install the signal handler + in order to be able to debug SDCC. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +TMP, +\begin_inset space ~ +\end_inset + +TEMP, +\begin_inset space ~ +\end_inset + +TMPDIR +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!TMP, TEMP, TMPDIR +\end_layout + +\end_inset + + +\series default + Path, where temporary files will be created. + The order of the variables is the search order. + In a standard *nix environment these variables are not set, and there's + no need to set them. + On Windows it's recommended to set one of them. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +SDCC_HOME +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +HOME +\end_layout + +\end_inset + + +\series default + Path, see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Install-paths" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset Quotes sld +\end_inset + + Install Paths +\begin_inset Quotes srd +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +SDCC_INCLUDE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +INCLUDE +\end_layout + +\end_inset + + +\series default + Path, see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Search-Paths" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset Quotes sld +\end_inset + +Search Paths +\begin_inset Quotes srd +\end_inset + +. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series bold +SDCC_LIB +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LIB +\end_layout + +\end_inset + + +\series default + Path, see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Search-Paths" + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset Quotes sld +\end_inset + +Search Paths +\begin_inset Quotes srd +\end_inset + +.. +\end_layout + +\begin_layout Standard +There are some more environment variables recognized by SDCC, but these + are mainly used for debugging purposes. + They can change or disappear very quickly, and will never be documented +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +if you are curious search in SDCC's sources for +\family typewriter + +\begin_inset Quotes sld +\end_inset + +getenv +\begin_inset Quotes srd +\end_inset + + +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!undocumented +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +SDCC Language Extensions +\end_layout + +\begin_layout Standard +SDCC supports some language extensions useful for embedded systems. + These include named address spaces (see also section 5.1 of the Embedded + C standard). + SDCC supports both intrinsic named address spaces (which ones are supported + depends on the target architecture) and non-intrinsic named address spaces + (defined by the user using the keyword __addressmod, they are particularly + useful with custom bank-switching hardware). + Unlike the Embedded C standard, SDCC allows local variables to have an + intrinsic named address space even when not explicitly declared as static + or extern. +\end_layout + +\begin_layout Subsection +MCS51/DS390 intrinsic named address spaces +\end_layout + +\begin_layout Standard +SDCC supports the following MCS51-specific intrinsic address spaces: +\end_layout + +\begin_layout Standard +\begin_inset Graphics + filename MCS51_named.svg + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +__data +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +data (mcs51, ds390 named address space) +\end_layout + +\end_inset + + / __near +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +near (named address space) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +This is the +\series bold +default +\series default + (generic) address space for the Small Memory model. + Variables in this address space will be allocated in the directly addressable + portion of the internal RAM of a 8051, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__data unsigned char test_data; +\end_layout + +\begin_layout Standard +Writing 0x01 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +75*00 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_test_data,#0x01 +\end_layout + +\begin_layout Subsubsection +__xdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +xdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + / __far +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +far (named address space) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Variables in this address space will be placed in the external RAM. + This is the +\series bold +default +\series default + (generic) address space for the Large Memory model, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__xdata unsigned char test_xdata; +\end_layout + +\begin_layout Standard +Writing 0x01 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +90s00r00 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dptr,#_test_xdata +\begin_inset Newline newline +\end_inset + +74 +\begin_inset space ~ +\end_inset + +01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,#0x01 +\begin_inset Newline newline +\end_inset + +F0 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx +\begin_inset space ~ +\end_inset + +@dptr,a +\end_layout + +\begin_layout Subsubsection +__idata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +idata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Variables in this address space will be allocated into the indirectly addressabl +e portion of the internal ram of a 8051, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__idata unsigned char test_idata; +\end_layout + +\begin_layout Standard +Writing 0x01 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +78r00 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r0,#_test_idata +\begin_inset Newline newline +\end_inset + +76 +\begin_inset space ~ +\end_inset + +01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +@r0,#0x01 +\end_layout + +\begin_layout Standard +Please note, the first 128 byte of idata physically access the same RAM + as the data memory. + The original 8051 had 128 byte idata memory, nowadays most devices have + 256 byte idata memory. + The stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + is located in idata memory (unless +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--xstack +\end_layout + +\end_inset + + is specified). +\end_layout + +\begin_layout Subsubsection +__pdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Paged xdata access is just as straightforward as using the other addressing + modes of a 8051. + It is typically located at the start of xdata and has a maximum size of + 256 bytes. + The following example writes 0x01 to the pdata variable. + Please note, pdata access physically accesses xdata memory. + The high byte of the address is determined by port P2 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +P2 (mcs51 sfr) +\end_layout + +\end_inset + +(or in case of some 8051 variants by a separate Special Function Register, + see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:MCS51-variants" + +\end_inset + +). + This is the +\series bold +default +\series default + (generic) address space for the Medium Memory model, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__pdata unsigned char test_pdata; +\end_layout + +\begin_layout Standard +Writing 0x01 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +78r00 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,#_test_pdata +\begin_inset Newline newline +\end_inset + +74 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,#0x01 +\begin_inset Newline newline +\end_inset + +F2 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx @r0,a +\end_layout + +\begin_layout Standard +If the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\end_layout + +\end_inset + + option is used the pdata memory area is followed by the xstack memory area + and the sum of their sizes is limited to 256 bytes. +\end_layout + +\begin_layout Subsubsection +__code +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +code +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +'Variables' in this address space will be placed in the code memory: +\end_layout + +\begin_layout Verse + +\family typewriter +__code unsigned char test_code; +\end_layout + +\begin_layout Standard +Read access to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +90s00r6F +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dptr,#_test_code +\begin_inset Newline newline +\end_inset + +E4 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +clr a +\begin_inset Newline newline +\end_inset + +93 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movc a,@a+dptr +\end_layout + +\begin_layout Standard + +\family typewriter +char +\family default + indexed arrays of characters in code memory can be accessed efficiently: +\end_layout + +\begin_layout Verse + +\family typewriter +__code char test_array[] = {'c','h','e','a','p'}; +\end_layout + +\begin_layout Standard +Read access to this array using an 8-bit unsigned index generates the assembly + code: +\end_layout + +\begin_layout Verse + +\family typewriter +E5*00 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,_index +\end_layout + +\begin_layout Verse + +\family typewriter +90s00r41 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dptr,#_test_array +\end_layout + +\begin_layout Verse + +\family typewriter +93 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movc a,@a+dptr +\end_layout + +\begin_layout Subsubsection +__bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +bit +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +This is a data-type and an address space. + When a variable is declared as a bit, it is allocated into the bit addressable + memory of 8051, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__bit test_bit; +\end_layout + +\begin_layout Standard +Writing 1 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +D2*00 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +setb +\begin_inset space ~ +\end_inset + +_test_bit +\end_layout + +\begin_layout Standard +The bit addressable memory consists of 128 bits which are located from 0x20 + to 0x2f in data memory. +\begin_inset Newline newline +\end_inset + +Apart from this 8051 specific intrinsic named address space most architectures + support ANSI-C bit-fields +\begin_inset Index idx +status open + +\begin_layout Plain Layout +bit-fields +\end_layout + +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Not really meant as examples, but nevertheless showing what bit-fields are + about: device/include/mc68hc908qy.h and support/regression/tests/bitfields.c +\end_layout + +\end_inset + +. + In accordance with ISO/IEC 9899 bits and bitfields without an explicit + signed modifier are implemented as unsigned. +\end_layout + +\begin_layout Subsubsection +__sfr +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr +\end_layout + +\end_inset + + / __sfr16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr16 +\end_layout + +\end_inset + + / __sfr32 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr32 +\end_layout + +\end_inset + + / __sbit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sbit +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Like the __bit keyword, +\emph on +__sfr / __sfr16 / __sfr32 / __sbit +\emph default + signify both a data-type and named address space, they are used to describe + the +\emph on +s +\emph default +pecial +\emph on +f +\emph default +unction +\emph on +r +\emph default +egisters and special +\emph on +__bit +\emph default + variables of a 8051, eg: +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + (0x80) P0; +\begin_inset space ~ +\end_inset + + /* special function register P0 at location 0x80 */ +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* 16 bit special function register combination for timer 0 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + with the high byte at location 0x8C and the low byte at location 0x8A */ +\begin_inset Newline newline +\end_inset + +__sfr16 __at (0x8C8A) TMR0; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +__sbit __at +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + (0xd7) CY; +\begin_inset space ~ +\end_inset + + /* CY (Carry Flag +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Flags +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Carry flag +\end_layout + +\end_inset + +) */ +\end_layout + +\begin_layout Standard +Special function registers which are located on an address dividable by + 8 are bit-addressable, an +\emph on +__sbit +\emph default + addresses a specific bit within these sfr. +\begin_inset Newline newline +\end_inset + +16 Bit and 32 bit special function register combinations which require a + certain access order are better not declared using +\emph on +__sfr16 +\emph default + or +\emph on +__sfr32. + +\emph default + Although SDCC usually accesses them Least Significant Byte (LSB) first, + this is not guaranteed. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +Please note, if you use a header file which was written for another compiler + then the __sfr / __sfr16 / __sfr32 / __sbit intrinsic named address spaces + will most likely be +\emph on +not +\emph default + compatible. + Specifically the syntax +\family typewriter + +\begin_inset space ~ +\end_inset + +sfr P0 = 0x80; +\begin_inset space ~ +\end_inset + + +\family default + is compiled +\emph on +without warning +\emph default + by SDCC to an assignment of 0x80 to a variable called P0 +\family typewriter +. + +\family default + +\series bold +Nevertheless with the file +\family typewriter +compiler.h +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +compiler.h (include file) +\end_layout + +\end_inset + + +\family default + it is possible to write header files +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Header files +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Include files +\end_layout + +\end_inset + + which can be shared among different compilers (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Porting-code-to-other-compilers" + +\end_inset + +). + +\end_layout + +\begin_layout Subsubsection +Pointers +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Pointer +\end_layout + +\end_inset + + to MCS51/DS390 intrinsic named address spaces +\end_layout + +\begin_layout Standard +SDCC allows (via language extensions) pointers to explicitly point to any + of the named address spaces +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory model +\end_layout + +\end_inset + + of the 8051. + In addition to the explicit pointers, the compiler uses (by default) generic + pointers which can be used to point to any of the memory spaces. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Pointer declaration examples: +\end_layout + +\begin_layout Verse + +\family typewriter +/* pointer physically in internal ram pointing to object in external ram + */ +\begin_inset Newline newline +\end_inset + +__xdata unsigned char * __data p; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* pointer physically in external ram pointing to object in internal ram + */ +\begin_inset Newline newline +\end_inset + +__data unsigned char * __xdata p; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* pointer physically in code rom pointing to data in xdata space */ +\begin_inset Newline newline +\end_inset + +__xdata unsigned char * __code p; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* pointer physically in code space pointing to data in code space */ +\begin_inset Newline newline +\end_inset + +__code unsigned char * __code p; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* generic pointer physically located in xdata space */ +\begin_inset Newline newline +\end_inset + +unsigned char * __xdata p; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* generic pointer physically located in default memory space */ +\begin_inset Newline newline +\end_inset + +unsigned char * p; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* the following is a function pointer +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function pointer +\end_layout + +\end_inset + + physically located in data space */ +\begin_inset Newline newline +\end_inset + +char (* __data fp)(void); +\end_layout + +\begin_layout Standard +Well you get the idea. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +All unqualified pointers are treated as 3-byte (4-byte for the ds390) +\emph on +generic +\emph default + pointers. +\size small + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\size default +The highest order byte of the +\emph on +generic +\emph default + pointers contains the data space information. + Assembler support routines are called whenever data is stored or retrieved + using +\emph on +generic +\emph default + pointers. + These are useful for developing reusable library +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Libraries +\end_layout + +\end_inset + + routines. + Explicitly specifying the pointer +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Pointer +\end_layout + +\end_inset + + type will generate the most efficient code. +\end_layout + +\begin_layout Subsubsection +Notes on MCS51 memory +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MCS51 memory +\end_layout + +\end_inset + + layout +\end_layout + +\begin_layout Standard +The 8051 family of microcontrollers have a minimum of 128 bytes of internal + RAM memory which is structured as follows: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers R0 to R7, +\begin_inset Newline newline +\end_inset + +- Bytes 20-2F - 16 bytes to hold 128 bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +bit +\end_layout + +\end_inset + + variables and, +\begin_inset Newline newline +\end_inset + +- Bytes 30-7F - 80 bytes for general purpose use. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +Additionally some members of the MCS51 family may have up to 128 bytes of + additional, indirectly addressable, internal RAM memory ( +\emph on +__idata +\emph default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +idata (mcs51, ds390 named address space) +\end_layout + +\end_inset + +). + Furthermore, some chips may have some built in external memory ( +\emph on +__xdata +\emph default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +xdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + +) which should not be confused with the internal, directly addressable RAM + memory ( +\emph on +__data +\emph default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +data (mcs51, ds390 named address space) +\end_layout + +\end_inset + +). + Sometimes this built in +\emph on +__xdata +\emph default + memory has to be activated before using it (you can probably find this + information on the datasheet of the microcontroller your are using, see + also section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:MCS51-Startup-Code" + +\end_inset + + +\begin_inset space ~ +\end_inset + +Startup-Code). +\end_layout + +\begin_layout Standard +Normally SDCC will only use the first bank +\begin_inset Index idx +status open + +\begin_layout Plain Layout +register bank (mcs51, ds390) +\end_layout + +\end_inset + + of registers (register bank 0), but it is possible to specify that other + banks of registers (keyword +\emph on +__using +\emph default + +\emph on + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +using (mcs51, ds390 register bank) +\end_layout + +\end_inset + + +\emph default +) should be used for example in interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +interrupt +\end_layout + +\end_inset + + routines. + By default, the compiler will place the stack after the last byte of allocated + memory for variables. + For example, if the first 2 banks of registers are used, and only four + bytes are used for +\emph on +data +\emph default + variables, it will position the base of the internal stack at address 20 + (0x14). + This implies that as the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + grows, it will use up the remaining register banks, and the 16 bytes used + by the 128 bit variables, and 80 bytes for general purpose use. + If any bit variables are used, the data variables will be placed in unused + register banks and after the byte holding the last bit variable. + For example, if register banks 0 and 1 are used, and there are 9 bit variables + (two bytes used), +\emph on +data +\emph default + variables will be placed starting from address 0x10 to 0x20 and continue + at address 0x22. + You can also use - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-data-loc <Value> +\end_layout + +\end_inset + + to specify the start address of the +\emph on +data +\emph default + and - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-iram-size +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-iram-size <Value> +\end_layout + +\end_inset + + to specify the size of the total internal RAM ( +\emph on +data +\emph default ++ +\emph on +idata +\emph default +). + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +By default the 8051 linker will place the stack after the last byte of (i)data + variables. + Option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc <Value> +\end_layout + +\end_inset + + allows you to specify the start of the stack, i.e. + you could start it after any data in the general purpose area. + If your microcontroller has additional indirectly addressable internal + RAM ( +\emph on +idata +\emph default +) you can place the stack on it. + You may also need to use - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xdata-loc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xdata-loc<Value> +\end_layout + +\end_inset + + to set the start address of the external RAM ( +\emph on +xdata +\emph default +) and - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-size +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xram-size <Value> +\end_layout + +\end_inset + + to specify its size. + Same goes for the code memory, using - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-loc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-loc <Value> +\end_layout + +\end_inset + + and - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-size +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-code-size <Value> +\end_layout + +\end_inset + +. + If in doubt, don't specify any options and see if the resulting memory + layout is appropriate, then you can adjust it. +\end_layout + +\begin_layout Standard +The linker generates two files with memory allocation information. + The first, with extension .map +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.map +\end_layout + +\end_inset + + shows all the variables and segments. + The second with extension .mem +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.mem +\end_layout + +\end_inset + + shows the final memory layout. + The linker will complain either if memory segments overlap, there is not + enough memory, or there is not enough space for stack. + If you get any linking warnings and/or errors related to stack or segments + allocation, take a look at either the .map or .mem files to find out what + the problem is. + The .mem file may even suggest a solution to the problem. +\end_layout + +\begin_layout Subsection +Z80/Z180/eZ80 intrinsic named address spaces +\end_layout + +\begin_layout Subsubsection +__sfr +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr +\end_layout + +\end_inset + + (in/out to 8-bit addresses) +\end_layout + +\begin_layout Standard +The Z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80 +\end_layout + +\end_inset + + family has separate address spaces for memory and +\emph on +i +\emph default +nput/ +\emph on +o +\emph default +utput memory. + I/O memory +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +I/O memory (Z80, Z180) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!I/O memory +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z180!I/O memory +\end_layout + +\end_inset + + is accessed with special instructions, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at 0x78 IoPort; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* define a var in I/O space at 78h called IoPort */ +\end_layout + +\begin_layout Standard +Writing 0x01 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +3E 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ld a,#0x01 +\begin_inset Newline newline +\end_inset + +D3 78 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +out (_IoPort),a +\end_layout + +\begin_layout Subsubsection +__banked __sfr +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr +\end_layout + +\end_inset + + (in/out to 16-bit addresses) +\end_layout + +\begin_layout Standard +The keyword +\emph on +__banked +\emph default + is used to support 16 bit addresses in I/O memory e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __banked __at +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + 0x123 IoPort; +\end_layout + +\begin_layout Standard +Writing 0x01 to this variable generates the assembly code: +\end_layout + +\begin_layout Verse + +\family typewriter +01 23 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ld bc,#_IoPort +\begin_inset Newline newline +\end_inset + +3E 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ld a,#0x01 +\begin_inset Newline newline +\end_inset + +ED 79 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +out (c),a +\end_layout + +\begin_layout Subsubsection +__sfr +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr +\end_layout + +\end_inset + + (in0/out0 to 8 bit addresses on Z180 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z180 +\end_layout + +\end_inset + +/HD64180 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HD64180 (see Z180) +\end_layout + +\end_inset + +) +\end_layout + +\begin_layout Standard +The compiler option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-portmode +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z180!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-portmode +\end_layout + +\end_inset + +=180 (80) and a compiler #pragma +\begin_inset space ~ +\end_inset + +portmode +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z180!Pragmas! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma portmode +\end_layout + +\end_inset + + z180 (z80) is used to turn on (off) the Z180/HD64180 port addressing instructio +ns +\family typewriter +in0/out0 +\family default + instead of +\family typewriter +in/out +\family default +. + If you include the file z180.h this will be set automatically. +\end_layout + +\begin_layout Subsection +HC08/S08 intrinsic named address spaces +\end_layout + +\begin_layout Subsubsection +__data +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +data (hc08 named address space) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Variables int the address space __data resides in the first 256 bytes of + memory (the direct page). + The HC08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08 +\end_layout + +\end_inset + + is most efficient at accessing variables (especially pointers) stored here. +\end_layout + +\begin_layout Subsubsection +__xdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +xdata (hc08 named address space) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Variables in the address space__xdata can reside anywhere in memory. + This is the default (generic address space). +\end_layout + +\begin_layout Subsection +PDK14/PDK15 intrinsic named address spaces +\end_layout + +\begin_layout Subsubsection +__sfr +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The Padauk family has separate address spaces for memory and +\emph on +i +\emph default +nput/ +\emph on +o +\emph default +utput memory. + I/O memory is accessed with special instructions, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at 0x18 gpcc; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* define a var in I/O space at 18h called gpcc */ +\end_layout + +\begin_layout Subsubsection +__sfr16 +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sfr16 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The Padauk family has a 16-bit timer accessed with special instructions. +\end_layout + +\begin_layout Subsection +Non-intrinsic named address spaces +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Non-intrinsic named address spaces +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC supports user-defined non-intrinsic named address spaces. + So far SDCC only supports them for bank-switching. + You need to have a function that switches to the desired memory bank and + declare a corresponding named address space: +\end_layout + +\begin_layout Verse + +\family typewriter +void setb0(void); // The function that sets the currently active memory + bank to b0 +\begin_inset Newline newline +\end_inset + +void setb1(void); // The function that sets the currently active memory + bank to b1 +\begin_inset Newline newline +\end_inset + +__addressmod +\family default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +addressmod +\end_layout + +\end_inset + + +\family typewriter + setb0 spaceb0; // Declare a named address space called spaceb0 that uses + setb0() +\begin_inset Newline newline +\end_inset + +__addressmod setb1 spaceb1; // Declare a named address space called spaceb1 + that uses setb1() +\begin_inset Newline newline +\end_inset + +spaceb0 int x; // An int in address space spaceb0 +\begin_inset Newline newline +\end_inset + +spaceb1 int *y; // A pointer to an int in address space spaceb1 +\begin_inset Newline newline +\end_inset + +spaceb0 int *spaceb1 z; // A pointer in address space spaceb1 that points + to an int in address space spaceb0 +\end_layout + +\begin_layout Standard +Non-intrinsic named address spaces for data in ROM are declared using the + const keyword: +\end_layout + +\begin_layout Verse + +\family typewriter +void setb0(void); // The function that sets the currently active memory + bank to b0 +\begin_inset Newline newline +\end_inset + +void setb1(void); // The function that sets the currently active memory + bank to b1 +\begin_inset Newline newline +\end_inset + +__addressmod +\family default + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +addressmod +\end_layout + +\end_inset + + +\family typewriter + setb0 const spaceb0; // Declare a named address space called spaceb0 that + uses setb0() and resides in ROM +\begin_inset Newline newline +\end_inset + +__addressmod setb1 spaceb1; // Declare a named address space called spaceb1 + that uses setb1() and resides in RAM +\begin_inset Newline newline +\end_inset + +const spaceb0 int x = 42; // An int in address space spaceb0 +\begin_inset Newline newline +\end_inset + +spaceb1 int *y; // A pointer to an int in address space spaceb1 +\begin_inset Newline newline +\end_inset + +const spaceb0 int *spaceb1 z; // A pointer in address space spaceb1 that + points to a constant int in address space spaceb0 +\end_layout + +\begin_layout Standard +Variables in non-intrinsic named address spaces will be placed in areas + of the same name (this can be used for the placement of named address spaces + in memory by the linker). +\end_layout + +\begin_layout Standard +SDCC will automatically insert calls to the corresponding function before + accessing the variable. + SDCC inserts the minimum possible number calls to the bank selection functions. + See Philipp Klaus Krause, +\begin_inset Quotes sld +\end_inset + +Optimal Placement of Bank Selection Instructions in Polynomial Time +\begin_inset Quotes srd +\end_inset + + for details on how this works. +\end_layout + +\begin_layout Subsection +Absolute Addressing +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Absolute addressing +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Data items can be assigned an absolute address with the +\emph on +__at +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + <address> +\emph default + keyword, which can also be used in addition to a named address space, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__xdata __at (0x7ffe) unsigned int chksum; +\end_layout + +\begin_layout Standard +In the above example the variable chksum will be located at 0x7ffe and 0x7fff + of the external ram. + The compiler does +\emph on +not +\emph default + reserve any space for variables declared in this way +\begin_inset Marginal +status collapsed + +\begin_layout Plain Layout + +\series bold +\begin_inset space ~ +\end_inset + +! +\end_layout + +\end_inset + + (they are implemented with an equate in the assembler). + Thus it is left to the programmer to make sure there are no overlaps with + other variables that are declared without the absolute address. + The assembler listing file (.lst +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.lst +\end_layout + +\end_inset + +) and the linker output files (.rst +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.rst +\end_layout + +\end_inset + +) and (.map +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.map +\end_layout + +\end_inset + +) are good places to look for such overlaps. +\end_layout + +\begin_layout Standard +If however you provide an initializer +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Variable initialization +\end_layout + +\end_inset + + actual memory allocation will take place and overlaps will be detected + by the linker. + E.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__code __at (0x7ff0) char Id[5] = +\begin_inset Quotes sld +\end_inset + +SDCC +\begin_inset Quotes srd +\end_inset + +; +\end_layout + +\begin_layout Standard +In the above example the variable Id will be located from 0x7ff0 to 0x7ff4 + in code memory. +\end_layout + +\begin_layout Standard +In case of memory mapped I/O devices the keyword +\emph on +volatile +\emph default + has to be used to tell the compiler that accesses might not be removed: +\end_layout + +\begin_layout Verse + +\family typewriter +volatile +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +volatile +\end_layout + +\end_inset + + __xdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +xdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + __at +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + (0x8000) unsigned char PORTA_8255; +\end_layout + +\begin_layout Standard +For some architectures (mcs51) array accesses are more efficient if an (xdata/fa +r) array +\family typewriter +\size footnotesize + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Aligned array +\end_layout + +\end_inset + + +\family default +\size default + starts at a block (256 byte) boundary +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +block boundary +\end_layout + +\end_inset + + (section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:A-Step-by Assembler Introduction" + +\end_inset + + has an example). +\begin_inset Newline newline +\end_inset + +Absolute addresses can be specified for variables in all named address spaces, + e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +__bit +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +bit +\end_layout + +\end_inset + + __at +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + (0x02) bvar; +\end_layout + +\begin_layout Standard +The above example will allocate the variable at offset 0x02 in the bit-addressab +le space. + There is no real advantage to assigning absolute addresses to variables + in this manner, unless you want strict control over all the variables allocated. + One possible use would be to write hardware portable code. + For example, if you have a routine that uses one or more of the microcontroller + I/O pins, and such pins are different for two different hardwares, you + can declare the I/O pins in your routine using: +\end_layout + +\begin_layout Verse + +\family typewriter +extern volatile +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +volatile +\end_layout + +\end_inset + + __bit MOSI; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* master out, slave in */ +\begin_inset Newline newline +\end_inset + +extern volatile __bit MISO; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* master in, slave out */ +\begin_inset Newline newline +\end_inset + +extern volatile __bit MCLK; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* master clock */ +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* Input and Output of a byte on a 3-wire serial bus. +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +If needed adapt polarity of clock, polarity of data and bit order +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + +*/ +\begin_inset Newline newline +\end_inset + +unsigned char spi_io(unsigned char out_byte) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +unsigned char i=8; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +do { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +MOSI = out_byte & 0x80; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +out_byte <<= 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +MCLK = 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* __asm nop __endasm; */ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* for slow peripherals */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +if(MISO) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +out_byte += 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +MCLK = 0; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +} while(--i); +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return out_byte; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +Then, someplace in the code for the first hardware you would use +\end_layout + +\begin_layout Verse + +\family typewriter +__bit __at +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + + (0x80) MOSI; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* I/O port 0, bit 0 */ +\begin_inset Newline newline +\end_inset + +__bit __at (0x81) MISO; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* I/O port 0, bit 1 */ +\begin_inset Newline newline +\end_inset + +__bit __at (0x82) MCLK; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* I/O port 0, bit 2 */ +\end_layout + +\begin_layout Standard +Similarly, for the second hardware you would use +\end_layout + +\begin_layout Verse + +\family typewriter +__bit __at (0x83) MOSI; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* I/O port 0, bit 3 */ +\begin_inset Newline newline +\end_inset + +__bit __at (0x91) MISO; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* I/O port 1, bit 1 */ +\begin_inset Newline newline +\end_inset + +__bit +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +bit +\end_layout + +\end_inset + + __at (0x92) MCLK; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* I/O port 1, bit 2 */ +\end_layout + +\begin_layout Standard +and you can use the same hardware dependent routine without changes, as + for example in a library. + This is somehow similar to sbit, but only one absolute address has to be + specified in the whole project. +\end_layout + +\begin_layout Subsection +Preserved register specification +\end_layout + +\begin_layout Standard +SDCC allows to specify preserved registers in function declarations, to + enable further optimizations on calls to functions implemented in assembler. + Example for the Z80 architecture specifying that a function will preserve + register pairs bc and iy: +\end_layout + +\begin_layout Verse + +\family typewriter +void f(void) __preserves_regs(b, c, iyl, iyh); +\end_layout + +\begin_layout Subsection +Binary constants +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Binary constants +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC supports the use of binary constants, such as 0b01100010. + This feature is only enabled when the compiler is invoked using +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--std-sdccxx +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Returning void +\end_layout + +\begin_layout Standard +SDCC allows functions to return expressions of type void. + This feature is only enabled when the compiler is invoked using +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--std-sdccxx +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Omitting promotion on arguments of vararg function (does not apply to pdk14, + pdk15) +\end_layout + +\begin_layout Standard +Arguments to vararg functions are not promoted when explicitly cast. + This feature is only enabled when the compiler is invoked using +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--std-sdccxx +\end_layout + +\end_inset + +. + This breaks compability with the C standards, so linking code compiled + with +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--std-sdccxx +\end_layout + +\end_inset + + with code compiled using +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--std-cxx +\end_layout + +\end_inset + + can result in failing programs when arguments to vararg functions are explicitl +y cast. +\end_layout + +\begin_layout Section +Parameters +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Parameters +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function parameter +\end_layout + +\end_inset + + and Local Variables +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +local variables +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "sec:Parameters-and-Local-Variables" + +\end_inset + + +\end_layout + +\begin_layout Standard +Automatic (local) variables and parameters to functions are placed on the + stack for most targets. + For MCS51/DS390/HC08/S08 they can either be placed on the stack or in data-spac +e. + The default action of the compiler is to place these variables in the internal + RAM (for small model) or external RAM (for medium or large model). + This in fact makes them similar to +\emph on +static +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +static +\end_layout + +\end_inset + + +\emph default + so by default functions are non-reentrant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + +. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +They can be placed on the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + by using the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\end_inset + + +\emph default + option, by using +\emph on +#pragma +\begin_inset space ~ +\end_inset + +stackauto +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma stackauto +\end_layout + +\end_inset + + or by using the +\emph on +__reentrant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + + +\emph default + keyword in the function declaration, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +unsigned char foo(char i) __reentrant +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... + +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +Since stack space on 8051 is limited, the +\emph on +__reentrant +\emph default + keyword or the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\emph default + option should be used sparingly. + Note that the reentrant keyword just means that the parameters & local + variables will be allocated to the stack, it +\emph on +does not +\emph default + mean that the function is register bank +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +register bank (mcs51, ds390) +\end_layout + +\end_inset + + independent. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Local variables +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +local variables +\end_layout + +\end_inset + + can be assigned intrinsic named address spaces and absolute +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Absolute addressing +\end_layout + +\end_inset + + addresses, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +unsigned char foo(__xdata int parm) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__xdata unsigned char i; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__bit bvar; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__data __at +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +at +\end_layout + +\end_inset + + (0x31) unsigned char j; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... + +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +In the above example the parameter +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function parameter +\end_layout + +\end_inset + + +\emph on +parm +\emph default + and the variable +\emph on +i +\emph default + will be allocated in the external ram, +\emph on +bvar +\emph default + in bit addressable space and +\emph on +j +\emph default + in internal ram. + When compiled with +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\emph default + or when a function is declared as +\emph on +reentrant +\emph default + this should only be done for static variables. +\end_layout + +\begin_layout Standard +It is however allowed to use bit parameters in reentrant functions and also + non-static local bit variables are supported. + Efficient use is limited to 8 semi-bitregisters in bit space. + They are pushed and popped to stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + as a single byte just like the normal registers. +\end_layout + +\begin_layout Section +Overlaying +\begin_inset CommandInset label +LatexCommand label +name "subsec:Overlaying" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Overlaying +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +For non-reentrant +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + + functions SDCC will try to reduce internal ram space usage by overlaying + parameters and local variables of a function (if possible). + Parameters and local variables +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +local variables +\end_layout + +\end_inset + + of a function will be allocated to an overlayable segment if the function + has +\emph on +no other function calls and the function is non-reentrant and the memory + model +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory model +\end_layout + +\end_inset + + is small. + +\emph default + If an explicit intrinsic named address space +\begin_inset Index idx +status open + +\begin_layout Plain Layout +intrinsic named address space +\end_layout + +\end_inset + + is specified for a local variable, it will NOT be overlaid. +\end_layout + +\begin_layout Standard +Note that the compiler (not the linkage editor) makes the decision for overlayin +g the data items. + Functions that are called from an interrupt service routine +\begin_inset Marginal +status collapsed + +\begin_layout Plain Layout + +\series bold +! +\end_layout + +\end_inset + + should be preceded by a #pragma +\begin_inset space ~ +\end_inset + +nooverlay +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nooverlay +\end_layout + +\end_inset + + if they are not reentrant. +\end_layout + +\begin_layout Standard +Also note that the compiler does not do any processing of inline assembler + code, so the compiler might incorrectly assign local variables and parameters + of a function into the overlay segment if the inline assembler code calls + other c-functions that might use the overlay. + In that case the #pragma +\begin_inset space ~ +\end_inset + +nooverlay should be used. +\end_layout + +\begin_layout Standard +Parameters and local variables of functions that contain 16 or 32 bit multiplica +tion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Multiplication +\end_layout + +\end_inset + + or division +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Division +\end_layout + +\end_inset + + will NOT be overlaid since these are implemented using external functions, + e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +#pragma save +\begin_inset Newline newline +\end_inset + +#pragma nooverlay +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nooverlay +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +void set_error(unsigned char errcd) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +P3 = errcd; +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + +#pragma restore +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void some_isr () __interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + (2) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +set_error(10); +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +In the above example the parameter +\emph on +errcd +\emph default + for the function +\emph on +set_error +\emph default + would be assigned to the overlayable segment if the #pragma +\begin_inset space ~ +\end_inset + +nooverlay was not present, this could cause unpredictable runtime behaviour + when called from an interrupt service routine. + The #pragma +\begin_inset space ~ +\end_inset + +nooverlay ensures that the parameters and local variables for the function + are NOT overlaid. +\end_layout + +\begin_layout Section +Interrupt Service Routines +\begin_inset CommandInset label +LatexCommand label +name "subsec:Interrupt-Service-Routines" + +\end_inset + + +\end_layout + +\begin_layout Subsection +General Information +\end_layout + +\begin_layout Standard +SDCC allows +\emph on +i +\emph default +nterrupt +\emph on +s +\emph default +ervice +\emph on +r +\emph default +outines to be coded in C, with some extended keywords. +\end_layout + +\begin_layout Verse + +\family typewriter +void timer_isr (void) __interrupt (1) __using (1) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +The optional number following the +\emph on +__interrupt +\begin_inset Index idx +status open + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +interrupt +\end_layout + +\end_inset + + +\emph default + keyword is the interrupt number this routine will service. + When present, the compiler will insert a call to this routine in the interrupt + vector table +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt vector table +\end_layout + +\end_inset + + for the interrupt number specified. + If you have multiple source files in your project, interrupt service routines + can be present in any of them, but a prototype of the isr MUST be present + or included in the file that contains the function +\emph on +main +\emph default +. + The optional (8051 specific) keyword +\emph on +__using +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +using (mcs51, ds390 register bank) +\end_layout + +\end_inset + + +\emph default + can be used to tell the compiler to use the specified register bank when + generating code for this function. +\begin_inset Newline newline +\end_inset + +Interrupt service routines open the door for some very interesting bugs: +\end_layout + +\begin_layout Subsubsection +\begin_inset CommandInset label +LatexCommand label +name "subsec:Common-interrupt-pitfall-volatile" + +\end_inset + +Common interrupt pitfall: variable not declared +\emph on +volatile +\end_layout + +\begin_layout Standard +If an interrupt service routine changes variables which are accessed by + other functions these variables have to be declared +\emph on +volatile +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +volatile +\end_layout + +\end_inset + +. + See +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://en.wikipedia.org/wiki/Volatile_variable +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsubsection +\begin_inset CommandInset label +LatexCommand label +name "subsec:Common-interrupt-pitfall-non-atomic" + +\end_inset + +Common interrupt pitfall: +\emph on +non-atomic access +\end_layout + +\begin_layout Standard +If the access to these variables is not +\emph on +atomic +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +atomic +\end_layout + +\end_inset + + +\emph default + (i.e. + the processor needs more than one instruction for the access and could + be interrupted while accessing the variable) the interrupt must be disabled + during the access to avoid inconsistent data. + +\begin_inset Newline newline +\end_inset + +Access to 16 or 32 bit variables is obviously not atomic on 8 bit CPUs and + should be protected by disabling interrupts. + You're not automatically on the safe side if you use 8 bit variables though. + We need an example here: f.e. + on the 8051 the harmless looking +\begin_inset Quotes srd +\end_inset + + +\family typewriter +flags +\begin_inset space ~ +\end_inset + +|= +\begin_inset space ~ +\end_inset + +0x80; +\family default + +\begin_inset Quotes sld +\end_inset + + is not atomic if +\family typewriter +flags +\family default + resides in xdata. + Setting +\begin_inset Quotes srd +\end_inset + + +\family typewriter +flags +\begin_inset space ~ +\end_inset + +|= +\begin_inset space ~ +\end_inset + +0x40; +\family default + +\begin_inset Quotes sld +\end_inset + + from within an interrupt routine might get lost if the interrupt occurs + at the wrong time. + +\begin_inset Quotes sld +\end_inset + + +\family typewriter +counter +\begin_inset space ~ +\end_inset + ++= +\begin_inset space ~ +\end_inset + +8; +\family default + +\begin_inset Quotes srd +\end_inset + + is not atomic on the 8051 even if +\family typewriter +counter +\family default + is located in data memory. +\begin_inset Newline newline +\end_inset + +Bugs like these are hard to reproduce and can cause a lot of trouble. + +\end_layout + +\begin_layout Subsubsection +\begin_inset CommandInset label +LatexCommand label +name "subsec:Common-interrupt-pitfall-stack-overflow" + +\end_inset + +Common interrupt pitfall: +\emph on +stack overflow +\end_layout + +\begin_layout Standard +The return address and the registers used in the interrupt service routine + are saved on the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + so there must be sufficient stack space. + If there isn't variables or registers (or even the return address itself) + will be corrupted. + This +\emph on +stack overflow +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack overflow +\end_layout + +\end_inset + + is most likely to happen if the interrupt occurs during the +\begin_inset Quotes sld +\end_inset + +deepest +\begin_inset Quotes srd +\end_inset + + subroutine when the stack is already in use for f.e. + many return addresses. +\end_layout + +\begin_layout Subsubsection +\begin_inset CommandInset label +LatexCommand label +name "subsec:Common-interrupt-pitfall-non-reentrant" + +\end_inset + +Common interrupt pitfall: +\emph on +use of non-reentrant functions +\end_layout + +\begin_layout Standard +A special note here, integer multiplicative operators and floating-point +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Floating point support +\end_layout + +\end_inset + + operations might be implemented using external support routines, depending + on the target architecture. + If an interrupt service routine needs to do any of these operations on + a target where functions are non-reentrant by default, then the support + routines (as mentioned in a following section) will have to be recompiled + using the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\end_inset + + +\emph default + option and the source file will need to be compiled using the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\end_layout + +\end_inset + + compiler option. + +\begin_inset Newline newline +\end_inset + +Note, the type promotion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +type promotion +\end_layout + +\end_inset + + required by ANSI C can cause 16 bit routines to be used +\begin_inset Marginal +status collapsed + +\begin_layout Plain Layout + +\series bold +\begin_inset space ~ +\end_inset + +! +\end_layout + +\end_inset + + without the programmer being aware of it. + See f.e. + the cast +\family typewriter +\series bold +(unsigned char)(tail-1) +\family default +\series default + +\series bold +within the if clause in section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:A-Step-by Assembler Introduction" + +\end_inset + +. +\end_layout + +\begin_layout Standard +Calling other functions from an interrupt service routine on a target where + functions are non-reentrant by default is not recommended, avoid it if + possible. + Note that when some function is called from an interrupt service routine + it should be preceded by a #pragma +\begin_inset space ~ +\end_inset + +nooverlay +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nooverlay +\end_layout + +\end_inset + + if it is not reentrant. + Furthermore non-reentrant functions should not be called from the main + program while the interrupt service routine might be active. + They also must not be called from low priority interrupt service routines + while a high priority interrupt service routine might be active. + You could use semaphores or make the function +\emph on +critical +\emph default + if all parameters are passed in registers. +\begin_inset Newline newline +\end_inset + + Also see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Overlaying" + +\end_inset + + +\begin_inset space ~ +\end_inset + +about Overlaying and section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Functions-using-private-banks" + +\end_inset + + +\begin_inset space ~ +\end_inset + +about Functions using private register banks. +\end_layout + +\begin_layout Subsection +MCS51/DS390 Interrupt Service Routines +\end_layout + +\begin_layout Standard +Interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + numbers and the corresponding address & descriptions for the Standard 8051/8052 + are listed below. + SDCC will automatically adjust the +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt vector table +\end_layout + +\end_inset + + to the maximum interrupt number specified. +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="9" columns="3"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top" width="0in"> +<column alignment="left" valignment="top" width="0in"> +<column alignment="left" valignment="top" width="0in"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt # +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Vector Address +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +External 0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x0003 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Timer 0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x000b +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +External 1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x0013 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +3 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Timer 1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x001b +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +4 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Serial +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x0023 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +5 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Timer 2 (8052) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x002b +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +... +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +... +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +n +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x0003 + 8*n +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +If the interrupt service routine is defined without +\emph on +__using +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +using (mcs51, ds390 register bank) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +using (mcs51, ds390 register bank) +\end_layout + +\end_inset + + +\emph default + a register bank or with register bank 0 ( +\emph on +__using +\emph default + 0), the compiler will save the registers used by itself on the stack upon + entry and restore them at exit, however if such an interrupt service routine + calls another function then the entire register bank will be saved on the + stack. + This scheme may be advantageous for small interrupt service routines which + have low register usage. +\end_layout + +\begin_layout Standard +If the interrupt service routine is defined to be using a specific register + bank then only +\emph on +a, b, dptr +\emph default + & psw are saved and restored, if such an interrupt service routine calls + another function (using another register bank) then the entire register + bank of the called function will be saved on the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + +. + This scheme is recommended for larger interrupt service routines. +\end_layout + +\begin_layout Subsection +HC08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08 +\end_layout + +\end_inset + + Interrupt Service Routines +\end_layout + +\begin_layout Standard +Since the number of interrupts +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08!interrupt +\end_layout + +\end_inset + + available is chip specific and the interrupt vector table always ends at + the last byte of memory, the interrupt numbers corresponds to the interrupt + vectors in reverse order of address. + For example, interrupt 1 will use the interrupt vector at 0xfffc, interrupt + 2 will use the interrupt vector at 0xfffa, and so on. + However, interrupt 0 (the reset vector at 0xfffe) is not redefinable in + this way; instead see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:MCS51-Startup-Code" + +\end_inset + + for details on customizing startup. +\end_layout + +\begin_layout Subsection +Z80 and Z180 Interrupt Service Routines +\end_layout + +\begin_layout Standard +The Z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80 +\end_layout + +\end_inset + + uses several different methods for determining the correct interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!interrupt +\end_layout + +\end_inset + + vector depending on the hardware implementation. + Therefore, SDCC does not attempt to generate an interrupt vector table. +\end_layout + +\begin_layout Standard +By default, SDCC generates code for a maskable interrupt, which uses a RETI + instruction to return from the interrupt. + To write an interrupt handler for the non-maskable interrupt, which needs + a RETN instruction instead, leave out the interrupt number: +\end_layout + +\begin_layout Verse + +\family typewriter +void nmi_isr (void) __critical __interrupt +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +Since interrupts on the Z80 and Z180 are level-triggered (except for the + NMI), interruptible interrupt handlers should only be used where hardware + acknowledge is available. +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="4" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top" width="30text%"> +<row> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Type +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Syntax +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Behaviour +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interruptible interrupt handler +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler can be interrupted by further interrupts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Non-interruptible interrupt handler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __critical __interrupt(0) +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler can be interrupted by NMI only +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +NMI handler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __critical __interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler can be interrupted by NMI only +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsection +Rabbit 2000, 3000, 3000A and 4000 Interrupt Service Routines +\end_layout + +\begin_layout Standard +SDCC does not attempt to generate an interrupt vector table. +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top" width="30text%"> +<row> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Type +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Syntax +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Behaviour +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interruptible interrupt handler +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler can be interrupted by further interrupts of same priority +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Non-interruptible interrupt handler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __critical __interrupt(0) +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler can be interrupted by interrupts of higher priority only +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsection +GBZ80 and TLCS-90 Interrupt Service Routines +\end_layout + +\begin_layout Standard +SDCC does not attempt to generate an interrupt vector table. +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top" width="30text%"> +<row> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Type +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Syntax +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Behaviour +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interruptible interrupt handler +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler can be interrupted by further interrupts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Non-interruptible interrupt handler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +void f(void) __critical __interrupt(0) +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt handler cannot be interrupted by further interrupts +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsection +STM8 Interrupt Service Routines +\end_layout + +\begin_layout Standard +The STM8 interrupt table contains 31 entries: Reset (used by SDCC for program + startup), trap and user interrupts 0 to 29. + Where the keyword +\emph on +__interrupt +\begin_inset Index idx +status open + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + +\emph default + is used for normal user interrupts, the +\emph on +__trap +\emph default + keyword is used for the trap handler: +\end_layout + +\begin_layout Verse + +\family typewriter +void handler (void) __trap +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Section +Enabling and Disabling Interrupts +\end_layout + +\begin_layout Subsection +Critical Functions and Critical Statements +\end_layout + +\begin_layout Standard +A special keyword may be associated with a block or a function declaring + it as +\emph on +__critical +\emph default +. + SDCC will generate code to disable all interrupts +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + upon entry to a critical function and restore the interrupt enable to the + previous state before returning. + Nesting critical functions will need one additional byte on the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + for each call. +\end_layout + +\begin_layout Verse + +\family typewriter +int foo () __critical +\begin_inset Index idx +status open + +\begin_layout Plain Layout +critical +\end_layout + +\end_inset + + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +critical +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +The critical attribute maybe used with other attributes like +\emph on +reentrant. +\emph default + +\begin_inset Newline newline +\end_inset + +The keyword +\emph on +__critical +\emph default + may also be used to disable interrupts more locally: +\end_layout + +\begin_layout Verse + +\family typewriter +__critical{ i++; } +\end_layout + +\begin_layout Standard +More than one statement could have been included in the block. +\end_layout + +\begin_layout Subsection +Enabling and Disabling Interrupts directly +\end_layout + +\begin_layout Standard +Interrupts +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + can also be disabled and enabled directly (8051): +\end_layout + +\begin_layout Verse + +\family typewriter +EA = 0; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +or: +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +EA_SAVE = EA; +\end_layout + +\begin_layout Verse + +\family typewriter +... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +EA = 0; +\end_layout + +\begin_layout Verse + +\family typewriter +EA = 1; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\end_layout + +\begin_layout Verse + +\family typewriter +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +EA = EA_SAVE; +\end_layout + +\begin_layout Standard +On other architectures which have separate opcodes for enabling and disabling + interrupts you might want to make use of defines with inline assembly +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler routines +\end_layout + +\end_inset + + (HC08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08!interrupt +\end_layout + +\end_inset + +): +\end_layout + +\begin_layout Verse + +\family typewriter +#define CLI __asm +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +cli +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + +; +\end_layout + +\begin_layout Verse + +\family typewriter +#define SEI __asm +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sei +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm; +\end_layout + +\begin_layout Verse +or for SDCC version 3.2.0 or newer: +\end_layout + +\begin_layout Verse + +\family typewriter +#define CLI asm ( +\begin_inset Quotes sld +\end_inset + +cli +\begin_inset Quotes srd +\end_inset + +); +\end_layout + +\begin_layout Verse + +\family typewriter +#define SEI asm ( +\begin_inset Quotes sld +\end_inset + +sei +\begin_inset Quotes srd +\end_inset + +); +\end_layout + +\begin_layout Standard +Note: it is sometimes sufficient to disable only a specific interrupt source + like f.e. + a timer or serial interrupt by manipulating an +\emph on +interrupt mask +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt mask +\end_layout + +\end_inset + + +\emph default + register. + +\end_layout + +\begin_layout Standard +Usually the time during which interrupts are disabled should be kept as + short as possible. + This minimizes both +\emph on +interrupt latency +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt latency +\end_layout + +\end_inset + + (the time between the occurrence of the interrupt and the execution of + the first code in the interrupt routine) and +\emph on +interrupt jitter +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt jitter +\end_layout + +\end_inset + + (the difference between the shortest and the longest interrupt latency). + These really are something different, f.e. + a serial interrupt has to be served before its buffer overruns so it cares + for the maximum interrupt latency, whereas it does not care about jitter. + On a loudspeaker driven via a digital to analog converter which is fed + by an interrupt a latency of a few milliseconds might be tolerable, whereas + a much smaller jitter will be very audible. +\end_layout + +\begin_layout Standard +You can re-enable interrupts within an interrupt routine and on some architectur +es you can make use of two (or more) levels of +\emph on +interrupt priorities +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt priority +\end_layout + +\end_inset + +. + On some architectures which don't support interrupt priorities these can + be implemented by manipulating the interrupt mask and re-enabling interrupts + within the interrupt routine. + Check there is sufficient space on the stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + and don't add complexity unless you have to. + +\end_layout + +\begin_layout Subsection +Semaphore +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +semaphore +\end_layout + +\end_inset + + locking (mcs51/ds390) +\end_layout + +\begin_layout Standard +Some architectures (mcs51/ds390) have an atomic +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +atomic +\end_layout + +\end_inset + + bit test and clear instruction. + These type of instructions are typically used in preemptive multitasking + systems, where a routine f.e. + claims the use of a data structure ('acquires a lock +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +lock +\end_layout + +\end_inset + + on it'), makes some modifications and then releases the lock when the data + structure is consistent again. + The instruction may also be used if interrupt and non-interrupt code have + to compete for a resource. + With the atomic bit test and clear instruction interrupts +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + don't have to be disabled for the locking operation. + +\end_layout + +\begin_layout Standard +SDCC generates this instruction if the source follows this pattern: +\end_layout + +\begin_layout Verse + +\family typewriter +volatile +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +volatile +\end_layout + +\end_inset + + bit resource_is_free; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +if (resource_is_free) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +resource_is_free=0; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +resource_is_free=1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +} +\end_layout + +\begin_layout Standard +Note, mcs51 and ds390 support only an atomic +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +atomic +\end_layout + +\end_inset + + bit test and +\emph on +clear +\emph default + instruction (as opposed to atomic bit test and +\emph on +set). +\end_layout + +\begin_layout Section +Functions using private register banks +\begin_inset CommandInset label +LatexCommand label +name "subsec:Functions-using-private-banks" + +\end_inset + + (mcs51/ds390) +\end_layout + +\begin_layout Standard +Some architectures have support for quickly changing register sets. + SDCC supports this feature with the +\emph on +__using +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +using (mcs51, ds390 register bank) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +using (mcs51, ds390 register bank) +\end_layout + +\end_inset + + +\emph default + attribute (which tells the compiler to use a register bank +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +register bank (mcs51, ds390) +\end_layout + +\end_inset + + other than the default bank zero). + It should only be applied to +\emph on +interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + +\emph default + functions (see footnote below). + This will in most circumstances make the generated ISR code more efficient + since it will not have to save registers on the stack. +\end_layout + +\begin_layout Standard +The +\emph on +__using +\emph default + attribute will have no effect on the generated code for a +\emph on +non-interrupt +\emph default + function (but may occasionally be useful anyway +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +possible exception: if a function is called ONLY from 'interrupt' functions + using a particular bank, it can be declared with the same 'using' attribute + as the calling 'interrupt' functions. + For instance, if you have several ISRs using bank one, and all of them + call memcpy(), it might make sense to create a specialized version of memcpy() + 'using 1', since this would prevent the ISR from having to save bank zero + to the stack on entry and switch to bank zero before calling the function +\end_layout + +\end_inset + +). +\begin_inset Newline newline +\end_inset + + +\emph on +(pending: Note, nowadays the +\emph default + __using +\emph on +attribute has an effect on +\emph default + +\emph on +the generated code for a +\emph default + non-interrupt +\emph on +function +\emph default +. +\emph on +) +\end_layout + +\begin_layout Standard +An +\emph on +interrupt +\emph default + function using a non-zero bank will assume that it can trash that register + bank, and will not save it. + Since high-priority interrupts +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupts +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt priority +\end_layout + +\end_inset + + can interrupt low-priority ones on the 8051 and friends, this means that + if a high-priority ISR +\emph on +using +\emph default + a particular bank occurs while processing a low-priority ISR +\emph on +using +\emph default + the same bank, terrible and bad things can happen. + To prevent this, no single register bank should be +\emph on +used +\emph default + by both a high priority and a low priority ISR. + This is probably most easily done by having all high priority ISRs use + one bank and all low priority ISRs use another. + If you have an ISR which can change priority at runtime, you're on your + own: I suggest using the default bank zero and taking the small performance + hit. +\end_layout + +\begin_layout Standard +It is most efficient if your ISR calls no other functions. + If your ISR must call other functions, it is most efficient if those functions + use the same bank as the ISR (see note 1 below); the next best is if the + called functions use bank zero. + It is very inefficient to call a function using a different, non-zero bank + from an ISR. + +\end_layout + +\begin_layout Section +Inline Assembler Code +\begin_inset CommandInset label +LatexCommand label +name "sec:Inline-Assembler-Code" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler routines +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Inline Assembler Code Formats +\end_layout + +\begin_layout Standard +SDCC supports two formats for inline assembler code definition: +\end_layout + +\begin_layout Subsubsection +Old __asm ... + __endasm; Format +\end_layout + +\begin_layout Standard +Most of inline assembler code examples in this manual use the old inline + assembler code format, but the new format could be used equivalently. +\end_layout + +\begin_layout Standard +Example: +\end_layout + +\begin_layout Verse + +\family typewriter +__asm +\family default + +\begin_inset Newline newline +\end_inset + + +\family typewriter + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; This is a comment +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +label: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +nop +\begin_inset Newline newline +\end_inset + +__endasm; +\end_layout + +\begin_layout Subsubsection +New __asm__ ( +\begin_inset Quotes sld +\end_inset + +inline_assembler_code +\begin_inset Quotes srd +\end_inset + +) Format +\end_layout + +\begin_layout Standard +The __asm__ inline assembler code format was introduced in SDCC version + 3.2.0. +\end_layout + +\begin_layout Standard +Example: +\end_layout + +\begin_layout Verse + +\family typewriter +__asm__ ( +\begin_inset Quotes sld +\end_inset + +; This is a comment +\backslash +nlabel: +\backslash +n +\backslash +tnop +\begin_inset Quotes srd +\end_inset + +); +\end_layout + +\begin_layout Subsection +A Step by Step Introduction +\begin_inset CommandInset label +LatexCommand label +name "subsec:A-Step-by Assembler Introduction" + +\end_inset + + +\end_layout + +\begin_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: +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +unsigned char __far +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +far (named address space) +\end_layout + +\end_inset + + __at +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +at +\end_layout + +\end_inset + +(0x7f00) buf[0x100]; +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Aligned array +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +unsigned char head, tail; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* if interrupts +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + are involved see +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Common-interrupt-pitfall-volatile" + +\end_inset + + about +\family default + +\family typewriter +\series bold +volatile +\family default +\series default + +\family typewriter +*/ +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void to_buffer( unsigned char c ) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +if( head != (unsigned char)(tail-1) ) +\begin_inset space ~ +\end_inset + +/* cast +\family default + +\family typewriter +\series bold +needed +\family default +\series default + +\family typewriter +to avoid promotion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +promotion to signed int +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +type promotion +\end_layout + +\end_inset + + to integer */ +\begin_inset Marginal +status collapsed + +\begin_layout Plain Layout + +\series bold +\begin_inset space ~ +\end_inset + +! +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +buf[ head++ ] = c; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* access to a 256 byte aligned array */ +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +If the code snippet (assume it is saved in buffer.c) is compiled with SDCC + then a corresponding buffer.asm file is generated. + We define a new function +\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 + + +\series bold +__asm +\series default + +\begin_inset Quotes srd +\end_inset + + and +\begin_inset Quotes sld +\end_inset + + +\series bold +__endasm; +\series default + +\begin_inset Quotes srd +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Note, that the single underscore form (_asm and _endasm) are not C99 compatible, + and for C99 compatibility, the double-underscore form (__asm and __endasm) + has to be used. + The latter is also used in the library functions. +\end_layout + +\end_inset + + to the beginning and the end of the function body: +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +/* With a cut and paste from the .asm file, we have something to start with. +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +The function is not yet OK! (registers aren't saved) */ +\begin_inset Newline newline +\end_inset + +void to_buffer_asm( unsigned char c ) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r2,dpl +\begin_inset Newline newline +\end_inset + +;buffer.c if( head != (unsigned char)(tail-1) ) +\begin_inset space ~ +\end_inset + +/* cast +\family default + +\family typewriter +\series bold +needed +\family default +\series default + +\family typewriter +to avoid promotion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +promotion to signed int +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +type promotion +\end_layout + +\end_inset + + to integer */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,_tail +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dec +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r3,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,_head +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +cjne a,ar3,00106$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ret +\begin_inset Newline newline +\end_inset + +00106$: +\begin_inset Newline newline +\end_inset + +;buffer.c buf[ head++ ] = c; /* access to a 256 byte aligned array */ +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Aligned array +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r3,_head +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_head +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dpl,r3 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dph,#(_buf >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,r2 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx @dptr,a +\begin_inset Newline newline +\end_inset + +00103$: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ret +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + +; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_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: +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +unsigned char __far __at(0x7f00) buf[0x100]; +\begin_inset Newline newline +\end_inset + +unsigned char head, tail; +\begin_inset Newline newline +\end_inset + +#define USE_ASSEMBLY (1) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +#if !USE_ASSEMBLY +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void to_buffer( unsigned char c ) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +if( head != (unsigned char)(tail-1) ) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +buf[ head++ ] = c; +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +#else +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void to_buffer( unsigned char c ) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +c; // to avoid warning: unreferenced function argument +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; save used registers here. +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; If we were still using r2,r3 we would have to push them here. +\begin_inset Newline newline +\end_inset + +; if( head != (unsigned char)(tail-1) ) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + a,_tail +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dec +\begin_inset space ~ +\end_inset + + a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +xrl +\begin_inset space ~ +\end_inset + + a,_head +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; we could do an ANL a,#0x0f here to use a smaller buffer (see below) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jz +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + t_b_end$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; +\begin_inset Newline newline +\end_inset + +; buf[ head++ ] = c; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + a,dpl +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; dpl holds lower byte of function argument +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + dpl,_head +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; buf is 0x100 byte aligned so head can be used directly +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + dph,#(_buf>>8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx @dptr,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc +\begin_inset space ~ +\end_inset + +_head +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; we could do an ANL _head,#0x0f here to use a smaller buffer (see above) +\begin_inset Newline newline +\end_inset + +t_b_end$: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; restore used registers here +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + +; +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + +#endif +\end_layout + +\begin_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/sdas/doc/asmlnk.txt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdas (sdasgb, sdas6808, sdas8051, sdasz80) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler documentation +\end_layout + +\end_inset + + or online at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/sdas/doc/asmlnk.txt +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Standard +The compiler does not do any validation of the code within the +\family typewriter +__asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + ... + __endasm +\size footnotesize + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + + +\size default +; +\family default + keyword pair. + Specifically it will not know which registers are used and thus register + pushing/popping +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +push/pop +\end_layout + +\end_inset + + has to be done manually. + +\end_layout + +\begin_layout Standard +It is required that each assembly instruction be placed on a separate line. + This is also recommended for labels (as the example shows). + This is especially important to note when the inline assembler is placed + in a C preprocessor macro as the preprocessor will normally put all replacing + code on a single line. + Only when the macro has each assembly instruction on a single line that + ends with a line continuation character will it be placed as separate lines + in the resulting .asm file. +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +#define +\begin_inset space ~ +\end_inset + +DELAY +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +nop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +nop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm +\end_layout + +\begin_layout Standard +When the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\emph on +peep-asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-asm +\end_layout + +\end_inset + + +\emph default + command line option is used, the inline assembler code will be passed through + the peephole optimizer +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Peephole optimizer +\end_layout + +\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 +peeph.def +\emph default + before using this option. +\end_layout + +\begin_layout Subsection +Naked Functions +\begin_inset CommandInset label +LatexCommand label +name "subsec:Naked-Functions" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Naked functions +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +A special keyword may be associated with a function declaring it as +\emph on +__naked +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +naked +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +naked +\end_layout + +\end_inset + +. + +\emph default + The +\emph on +_naked +\emph default + function modifier attribute prevents the compiler from generating prologue +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function prologue +\end_layout + +\end_inset + + and epilogue +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function epilogue +\end_layout + +\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: +\end_layout + +\begin_layout Verse + +\family typewriter +volatile +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +volatile +\end_layout + +\end_inset + + data unsigned char counter; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void simpleInterrupt(void) __interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +interrupt +\end_layout + +\end_inset + + (1) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +counter++; +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void nakedInterrupt(void) __interrupt (2) __naked +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_counter ; does not change flags, no need to save psw +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +reti +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; MUST explicitly include ret or reti in _naked function. +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + +; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +For an 8051 target, the generated simpleInterrupt looks like: +\end_layout + +\begin_layout Verse + +\family typewriter +Note, this is an +\family default + +\family typewriter +\emph on +outdated +\family default +\emph default + +\family typewriter +example, recent versions of SDCC generate +\begin_inset Newline newline +\end_inset + +the +\family default + +\family typewriter +\emph on +same +\family default +\emph default + +\family typewriter +code for simpleInterrupt() and nakedInterrupt()! +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +_simpleInterrupt: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +acc +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +b +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dpl +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dph +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +psw +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +psw,#0x00 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_counter +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +psw +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dph +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dpl +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +b +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +acc +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +reti +\end_layout + +\begin_layout Standard +whereas nakedInterrupt looks like: +\end_layout + +\begin_layout Verse + +\family typewriter +_nakedInterrupt: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_counter ; does not change flags, no need to save psw +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +reti +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; MUST explicitly include ret or reti in _naked function +\end_layout + +\begin_layout Standard +The related directive #pragma exclude +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma exclude +\end_layout + +\end_inset + + allows a more fine grained control over pushing & popping +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +push/pop +\end_layout + +\end_inset + + the registers. +\end_layout + +\begin_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. +\end_layout + +\begin_layout Subsection +Use of Labels within Inline Assembler +\end_layout + +\begin_layout Standard +SDCC allows the use of in-line assembler with a few restrictions regarding + labels. + All labels defined within inline assembler code have to be of the form + +\emph on +nnnnn$ +\emph default + where nnnnn is a number less than 100 (which implies a limit of utmost + 100 inline assembler labels +\emph on +per function +\emph default +\noun on +) +\noun default +. +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +This is a slightly more stringent rule than absolutely necessary, but stays + always on the safe side. + Labels in the form of nnnnn$ are local labels in the assembler, locality + of which is confined within two labels of the standard form. + The compiler uses the same form for labels within a function (but starting + from nnnnn=00100); and places always a standard label at the beginning + of a function, thus limiting the locality of labels within the scope of + the function. + So, if the inline assembler part would be embedded into C-code, an improperly + placed non-local label in the assembler would break up the reference space + for labels created by the compiler for the C-code, leading to an assembling + error. +\end_layout + +\begin_layout Plain Layout +The numeric part of local labels does not need to have 5 digits (although + this is the form of labels output by the compiler), any valid integer will + do. + Please refer to the assemblers documentation for further details. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Verse + +\family typewriter +__asm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +b,#10 +\begin_inset Newline newline +\end_inset + +00001$: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +djnz +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +b,00001$ +\begin_inset Newline newline +\end_inset + +__endasm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + + ; +\end_layout + +\begin_layout Standard +Inline assembler code cannot reference any C-labels, however it can reference + labels +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Labels +\end_layout + +\end_inset + + defined by the inline assembler, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +foo() { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* some c code */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; some assembler code +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ljmp 0003$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* some more c code */ +\begin_inset Newline newline +\end_inset + +clabel: +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* inline assembler cannot reference this label */ +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Here, the C-label +\family typewriter +clabel +\family default + is translated by the compiler into a local label, so the locality of labels + within the function is not broken. +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +0003$: ;label (can be referenced by inline assembler only) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +endasm +\end_layout + +\end_inset + + ; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* some more c code */ +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_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. +\end_layout + +\begin_layout Section +Support routines for integer multiplicative operators +\end_layout + +\begin_layout Standard +Depending on the target architecture, some integer multiplicative operators + might be implemented by support routines. + These support routines exist in portable C versions to facilitate porting + to other MCUs, although depending on the target, assembler routines might + be used instead. + The following files contain some of the described routines, all of them + can be found in <installdir>/share/sdcc/lib. +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="11" columns="2"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Function +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_mulint.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16 bit multiplication +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_divsint.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + signed 16 bit division (calls _divuint) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_divuint.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + unsigned 16 bit division +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_modsint.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signed 16 bit modulus (calls _moduint) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_moduint.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned 16 bit modulus +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_mullong.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +32 bit multiplication +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_divslong.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + signed 32 division (calls _divulong) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_divulong.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned 32 division +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_modslong.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + signed 32 bit modulus (calls _modulong) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_modulong.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unsigned 32 bit modulus +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +In the mcs51, ds390, hc08, s08, pic14 and pic16 backends they are by default + compiled as +\emph on +non-reentrant +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + +; when targeting on of these architectures, interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\end_inset + + +\emph default + option, after which the source program will have to be compiled with +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\end_layout + +\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. +\end_layout + +\begin_layout Section +Floating Point Support +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Floating point support +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC supports (single precision 4 bytes) floating point numbers; the format + is somewhat similar to IEEE, but it is not IEEE; in particular, denormalized + floating -point numbers are not supported. + The floating point support routines are derived from gcc's floatlib.c and + consist of the following routines: +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center + +\size footnotesize +\begin_inset Tabular +<lyxtabular version="3" rows="17" columns="2"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="left" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +Function +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fsadd.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +add floating point numbers +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fssub.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +subtract floating point numbers +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fsdiv.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +divide floating point numbers +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fsmul.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +multiply floating point numbers +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2uchar.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to unsigned char +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2char.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to signed char +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2uint.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to unsigned int +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2int.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to signed int +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\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 +c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to unsigned long +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_fs2long.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert floating point to signed long +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_uchar2fs.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert unsigned char to floating point +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_char2fs.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert char to floating point number +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_uint2fs.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert unsigned int to floating point +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_int2fs.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert int to floating point numbers +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_ulong2fs.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert unsigned long to floating point number +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +_long2fs.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +convert long to floating point number +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Section +Library Routines +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Libraries +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\emph on +<pending: this is messy and incomplete - a little more information is at + +\emph default + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/index.php/List_of_the_SDCC_library +\end_layout + +\end_inset + +> +\end_layout + +\begin_layout Subsection +Compiler support routines (_gptrget, _mulint etc.) +\end_layout + +\begin_layout Subsection +Stdclib functions (puts, printf, strcat etc.) +\end_layout + +\begin_layout Subsubsection +<stdio.h> +\end_layout + +\begin_layout Paragraph +getchar(), putchar() +\end_layout + +\begin_layout Standard +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<stdio.h> +\end_layout + +\end_inset + +As usual on embedded systems you have to provide your own +\family typewriter +getchar() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +getchar() +\end_layout + +\end_inset + + +\family default + and +\family typewriter +putchar() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +putchar() +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!putchar() +\end_layout + +\end_inset + + +\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: +\end_layout + +\begin_layout Verse + +\family typewriter +int putchar (int c) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +while (!TI) +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + /* assumes UART is initialized */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +TI = 0; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SBUF = c; +\end_layout + +\begin_layout Verse + +\family typewriter +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return c; +\end_layout + +\begin_layout Verse + +\family typewriter +} +\end_layout + +\begin_layout Paragraph +printf() +\end_layout + +\begin_layout Standard +The default +\family typewriter +printf() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf() +\end_layout + +\end_inset + + +\family default + implementation in +\family typewriter +printf_large.c +\family default + does not support float +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Floating point support +\end_layout + +\end_inset + + (except on ds390), only <NO FLOAT> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<NO FLOAT> +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!floating point support +\end_layout + +\end_inset + + will be printed instead of the value. + To enable floating point output, recompile it with the option +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +DUSE_FLOATS=1 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +USE +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +FLOATS +\end_layout + +\end_inset + + +\emph default + on the command line. + Use +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-large +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-large +\end_layout + +\end_inset + + +\emph default + for the mcs51 port, since this uses a lot of memory. + To enable float support for the pic16 targets, see +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:pic16Libraries" + +\end_inset + +. +\end_layout + +\begin_layout Standard +If you're short on code memory you might want to use +\family typewriter +printf_small() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!printf +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +small() +\end_layout + +\end_inset + + +\family default + +\emph on +instead +\emph default + of +\family typewriter +printf(). + +\family default + For the mcs51 there additionally are assembly versions +\family typewriter +printf_tiny() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!printf +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +tiny() (mcs51) +\end_layout + +\end_inset + + +\family default + (subset of printf using less than 270 bytes) and +\family typewriter +printf_fast() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!printf +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +fast() (mcs51) +\end_layout + +\end_inset + + +\family default + and +\family typewriter +printf_fast_f() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!printf +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +fast +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +f() (mcs51) +\end_layout + +\end_inset + + +\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. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +Feature matrix of different +\emph on +printf +\emph default + options on mcs51. +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="14" columns="7"> +<features islongtable="true" longtabularalignment="center"> +<column alignment="left" valignment="middle" width="14col%"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top" width="12col%"> +<column alignment="center" valignment="top" width="10col%"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top" width="12col%"> +<column alignment="center" valignment="top"> +<row endhead="true"> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +\size large +mcs51 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +printf +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf() +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +printf +\size scriptsize +USE_FLOATS=1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +printf_small +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +printf_fast +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +printf_fast_f +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +printf_tiny +\end_layout + +\end_inset +</cell> +</row> +<row endhead="true"> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +filename +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size scriptsize +printf_large.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size scriptsize +printf_large.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size scriptsize +printfl.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size scriptsize +printf_fast.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size scriptsize +printf_fast_f.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size scriptsize +printf_tiny.c +\end_layout + +\end_inset +</cell> +</row> +<row endhead="true"> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Quotes sld +\end_inset + +Hello World +\begin_inset Quotes srd +\end_inset + + size +\end_layout + +\begin_layout Plain Layout +small / large +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.7k / 2.4k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +4.3k / 5.6k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.2k / 1.8k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.3k / 1.3k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.9k / 1.9k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.44k / 0.44k +\end_layout + +\end_inset +</cell> +</row> +<row endhead="true"> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +code size +\end_layout + +\begin_layout Plain Layout +small / large +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.4k / 2.0k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +2.8k / 3.7k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.45k / 0.47k (+ _ltoa) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.2k / 1.2k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.6k / 1.6k +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.26k / 0.26k +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +formats +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cdi +\emph on +o +\emph default +psux +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\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_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +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 +\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 +\bar default +\noun default +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cdsux +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cdfsux +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cdsux +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +long (32 bit) support +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +byte arguments on stack +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +b +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +b +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +float format +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Floating point support +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +%f +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +%f +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Range limited to +/- 4294967040, precision limited to 8 digits past decimal +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +float formats %e %g +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +field width +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +x +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +string speed +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Execution time of printf("%s%c%s%c%c%c", "Hello", ' ', "World", '!', ' +\backslash +r', ' +\backslash +n'); standard 8051 @ 22.1184 MHz, empty putchar() +\end_layout + +\end_inset + +, +\end_layout + +\begin_layout Plain Layout +small / large +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.52 / 2.59 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.53 / 2.62 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.92 / 0.93 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.45 / 0.45 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.46 / 0.46 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.45 / 0.45 ms +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +int speed +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Execution time of printf("%d", -12345); standard 8051 @ 22.1184 MHz, empty + putchar() +\end_layout + +\end_inset + +, +\end_layout + +\begin_layout Plain Layout +small / large +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +3.01 / 3.61 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +3.01 / 3.61 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +3.51 / 18.13 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.22 / 0.22 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.23 / 0.23 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.25 / 0.25 ms +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +printf_tiny integer speed is data dependent, worst case is 0.33 ms +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +long speed +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Execution time of printf("%ld", -123456789); standard 8051 @ 22.1184 MHz, + empty putchar() +\end_layout + +\end_inset + +, +\end_layout + +\begin_layout Plain Layout +small / large +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +5.37 / 6.31 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +5.37 / 6.31 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8.71 / 40.65 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.40 / 0.40 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0.40 / 0.40 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +float speed +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Execution time of printf("%.3f", -12345.678); standard 8051 @ 22.1184 MHz, + empty putchar() +\end_layout + +\end_inset + +, +\end_layout + +\begin_layout Plain Layout +small / large +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +7.49 / 22.47 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1.04 / 1.04 ms +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +- +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +<malloc.h> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +malloc.h +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +As of SDCC 2.6.2 you no longer need to call an initialization routine before + using dynamic memory allocation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +dynamic memory allocation (malloc) +\end_layout + +\end_inset + + and a default heap +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +heap (malloc) +\end_layout + +\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: +\end_layout + +\begin_layout Verse + +\family typewriter +sdcc -c _heap.c -D HEAP_SIZE=2048 +\end_layout + +\begin_layout Standard +And then link it with: +\end_layout + +\begin_layout Verse + +\family typewriter +sdcc main.rel _heap.rel +\end_layout + +\begin_layout Subsection +Math functions (sinf, powf, sqrtf etc.) +\end_layout + +\begin_layout Subsubsection +<math.h> +\end_layout + +\begin_layout Standard +See definitions in file <math.h>. +\end_layout + +\begin_layout Subsection +Other libraries +\end_layout + +\begin_layout Standard +Libraries +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Libraries +\end_layout + +\end_inset + + included in SDCC should have a license at least as liberal as the GPLv2+LE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +GPLv2+LE +\end_layout + +\end_inset + +. + Exception are pic device libraries and header files which are derived from + Microchip header (.inc) and linker script (.lkr) files. + Microchip requires that "The header files should state that they are only + to be used with authentic Microchip devices" which makes them incompatible + with GPL. +\end_layout + +\begin_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 Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/mailman/sdcc-user/ +\end_layout + +\end_inset + + would certainly like to hear about it. +\end_layout + +\begin_layout Standard +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. +\end_layout + +\begin_layout Section +Memory Models +\end_layout + +\begin_layout Subsection +MCS51 Memory Models +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory model +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MCS51 memory model +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Small, Medium, Large and Huge +\end_layout + +\begin_layout Standard +SDCC allows four memory models for MCS51 code, +\shape slanted +small, medium, large +\shape default + and +\shape slanted +huge +\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 for all models + (however, the libraries for –stack-auto are compiled for the small and + large models only). + The compiled library modules are contained in separate directories as small, + medium, large and huge so that you can link to the appropriate set. +\end_layout + +\begin_layout Standard +When the medium, large or huge model is used all variables declared without + specifying an intrinsic named address space will be allocated into the + external ram, this includes all parameters and local variables (for non-reentra +nt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + + functions). + Medium model uses pdata and large and huge models use xdata. + When the small model is used variables without an explicitly specified + intrinsic named address space are allocated in the internal ram. +\end_layout + +\begin_layout Standard +The huge model compiles all functions as +\emph on +banked +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Bankswitching" + +\end_inset + + +\emph default + and is otherwise equal to large for now. + All other models compile the functions without bankswitching by default. +\end_layout + +\begin_layout Standard +Judicious usage of the processor specific intrinsic named address spaces +\begin_inset Index idx +status open + +\begin_layout Plain Layout +intrinsic named address space +\end_layout + +\end_inset + + 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. +\end_layout + +\begin_layout Subsubsection +External Stack +\begin_inset CommandInset label +LatexCommand label +name "subsec:External-Stack" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +External stack (mcs51) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The external stack (- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack option +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\end_layout + +\end_inset + +) is located in pdata +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pdata (mcs51, ds390 named address space) +\end_layout + +\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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack option is used to compile the program, the parameters and local + variables +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +local variables +\end_layout + +\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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\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). +\end_layout + +\begin_layout Standard +The compiler outputs the higher order address byte of the external ram segment + into port P2 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +P2 (mcs51 sfr) +\end_layout + +\end_inset + + (see also section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:MCS51-variants" + +\end_inset + +), therefore when using the External Stack option, this port +\emph on +may not +\emph default + be used by the application program. +\end_layout + +\begin_layout Subsection +DS390 Memory Model +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory model +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS390 memory model +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The only model supported is Flat 24 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Flat 24 (DS390 memory model) +\end_layout + +\end_inset + +. + 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. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Note that the compiler does not generate any code to place the processor + into 24 bit mode (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 Index idx +status collapsed + +\begin_layout Plain Layout +Tinibios (DS390) +\end_layout + +\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. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Like the +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-large +\emph default + option, variables will by default be placed into the XDATA segment. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Segments may be placed anywhere in the 4 meg address space using the usual + - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-*-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. +\end_layout + +\begin_layout Subsection +STM8 Memory Models +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory model +\end_layout + +\end_inset + + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +STM8 memory models +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC implements two memory models for the STM8: +\emph on +medium +\emph default + (default) and +\emph on +large +\emph default +. + Modules compiled with different memory models should +\emph on +never +\emph default + be combined together. + The library routines supplied with the compiler are compiled for all models. +\end_layout + +\begin_layout Standard +In the medium model the address space is 16 bits for both objects and functions, + allowing for a memory space of 64 KB. + Since the STM8 typically has Flash starting at 0x8000, this means that + only up to 32 KB of Flash can be used (most STM8 devices don't have more + than 32 KB of Flash). +\end_layout + +\begin_layout Standard +In the large memory model, the address space is 16 bits for objects and + 24 bits for functions. + Since the STM8 typically has flash starting at 0x8000, this means that + up to 32 KB of flash can be used for constant data, while the whole Flash + can be used for functions. + Code generated for the large model is slightly bigger and slower and needs + slightly more stack space than code generated for the medium model. +\end_layout + +\begin_layout Section +Pragmas +\begin_inset CommandInset label +LatexCommand label +name "sec:Pragmas" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Pragmas +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Pragmas are used to turn on and/or off certain compiler options. + Some of them are closely related to corresponding command-line options + (see section +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:Command-Line-Options" + +\end_inset + +). +\begin_inset Newline newline +\end_inset + +Pragmas should be placed before and/or after a function, placing pragmas + inside a function body could have unpredictable results. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +SDCC supports the following #pragma directives: +\end_layout + +\begin_layout Itemize + +\series bold +save +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma save +\end_layout + +\end_inset + + - this will save most current options to the save/restore stack. + See #pragma +\begin_inset space ~ +\end_inset + +restore. +\end_layout + +\begin_layout Itemize + +\series bold +restore +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma restore +\end_layout + +\end_inset + + - will restore saved options from the last save. + saves & restores can be nested. + SDCC uses a save/restore stack: save pushes current options to the stack, + restore pulls current options from the stack. + See #pragma +\begin_inset space ~ +\end_inset + +save. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +callee_saves +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma callee +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +saves +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function prologue +\end_layout + +\end_inset + + function1[,function2[,function3...]] +\begin_inset CommandInset label +LatexCommand label +name "ite:callee_saves-function1[,function2[,function3...]]--" + +\end_inset + +- The compiler by default uses a caller saves convention for register saving + across function calls, however this can cause unnecessary register pushing + and popping +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +push/pop +\end_layout + +\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 and exit for these functions + to save and restore the registers used by these functions, this can SUBSTANTIAL +LY reduce code and 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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves command line option is used (see page +\begin_inset CommandInset ref +LatexCommand vpageref +reference "lyx:--callee-saves-function1[,function2][,function3]..." + +\end_inset + +), the function names specified in #pragma +\begin_inset space ~ +\end_inset + +callee_saves +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma callee +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +saves +\end_layout + +\end_inset + + is appended to the list of functions specified in the command line. +\end_layout + +\begin_layout Itemize + +\series bold +exclude +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma exclude +\end_layout + +\end_inset + + none | {acc[,b[,dpl[,dph[,bits]]]]} - The exclude pragma disables the generatio +n of pairs of push/pop +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +push/pop +\end_layout + +\end_inset + + instructions in +\emph on +I +\emph default +nterrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + +\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 +\begin_inset space ~ +\end_inset + +exclude +\begin_inset space ~ +\end_inset + +none +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma exclude +\end_layout + +\end_inset + +. + See also the related keyword +\emph on +__naked +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +naked +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +naked +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\series bold +less_pedantic +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +pedantic +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma less +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pedantic +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "ite:less_pedantic" + +\end_inset + + - the compiler will not warn you anymore for obvious mistakes, you're on + your own now ;-(. + See also the command line option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-less-pedantic +\begin_inset CommandInset ref +LatexCommand vpageref +reference "lyx:--less-pedantic" + +\end_inset + +. + +\begin_inset Newline newline +\end_inset + +More specifically, the following warnings will be disabled: +\shape italic +comparison is always [true/false] due to limited range of data type +\shape default + (94); +\shape italic +overflow in implicit constant conversion +\shape default + (158); [the (in)famous] +\shape italic +conditional flow changed by optimizer: so said EVELYN the modified DOG +\shape default + (110); +\shape italic +function '[function name]' must return value +\shape default + (59). + +\begin_inset Newline newline +\end_inset + +Furthermore, warnings of less importance (of PEDANTIC and INFO warning level) + are disabled, too, namely: +\shape italic +constant value '[ +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +dunno what comes here - this warning appears to be unused altogether +\end_layout + +\end_inset + +]', out of range +\shape default + (81); +\shape italic +[left/right] shifting more than size of object changed to zero +\shape default + (116); +\shape italic +unreachable code +\shape default + (126); +\shape italic +integer overflow in expression +\shape default + (165); +\shape italic +unmatched #pragma save and #pragma restore +\shape default + (170); +\shape italic +comparison of 'signed char' with 'unsigned char' requires promotion to int +\shape default + (185); +\shape italic +ISO C90 does not support flexible array members +\shape default + (187); +\shape italic +extended stack by [number] bytes for compiler temp(s) :in function '[function +\begin_inset space ~ +\end_inset + +name]': +\begin_inset space ~ +\end_inset + +[ +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +appears to be always blank - what was supposed to be here? +\end_layout + +\end_inset + +] +\shape default + (114); +\shape italic +function '[function name]', # edges [number] , # nodes [number] , cyclomatic + complexity [number] +\shape default + (121). +\end_layout + +\begin_layout Itemize + +\series bold +disable_warning +\series default + <nnnn> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma disable +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +warning +\end_layout + +\end_inset + + - the compiler will not warn you anymore about warning number <nnnn>. +\end_layout + +\begin_layout Itemize + +\series bold +nogcse +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nogcse +\end_layout + +\end_inset + + - will stop global common subexpression elimination. +\end_layout + +\begin_layout Itemize + +\series bold +noinduction +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noinduction +\end_layout + +\end_inset + + - will stop loop induction optimizations. +\end_layout + +\begin_layout Itemize + +\series bold +noinvariant +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noinvariant +\end_layout + +\end_inset + + - will not do loop invariant optimizations. + For more details see Loop Invariants in section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Loop-Optimizations" + +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\series bold +noiv +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noiv +\end_layout + +\end_inset + + - Do not generate interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt +\end_layout + +\end_inset + + vector table +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +interrupt vector table +\end_layout + +\end_inset + + 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 omitting the optional interrupt + number after the +\emph on +__interrupt +\emph default + keyword, see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Interrupt-Service-Routines" + +\end_inset + + +\begin_inset space ~ +\end_inset + +about interrupts. +\end_layout + +\begin_layout Itemize + +\series bold +noloopreverse +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noloopreverse +\end_layout + +\end_inset + + - Will not do loop reversal optimization +\end_layout + +\begin_layout Itemize + +\series bold +nooverlay +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nooverlay +\end_layout + +\end_inset + + - the compiler will not overlay the parameters and local variables of a + function. +\end_layout + +\begin_layout Itemize + +\series bold +stackauto +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma stackauto +\end_layout + +\end_inset + +- See option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\end_layout + +\end_inset + + and section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Parameters-and-Local-Variables" + +\end_inset + + Parameters and Local Variables. +\end_layout + +\begin_layout Itemize + +\series bold +opt_code_speed +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma opt +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +code +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +speed +\end_layout + +\end_inset + +- The compiler will optimize code generation towards fast code, possibly + at the expense of code size. +\end_layout + +\begin_layout Itemize + +\series bold +opt_code_size +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma opt +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +code +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +size +\end_layout + +\end_inset + +- The compiler will optimize code generation towards compact code, possibly + at the expense of code speed. + +\end_layout + +\begin_layout Itemize + +\series bold +opt_code_balanced +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma opt +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +code +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +balanced +\end_layout + +\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). + +\end_layout + +\begin_layout Itemize + +\series bold +std_sdcc89 +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma std +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sdcc89 +\end_layout + +\end_inset + +- Generally follow the C89 standard, but allow SDCC features that conflict + with the standard. +\end_layout + +\begin_layout Itemize + +\series bold +std_c89 +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma std +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +c89 +\end_layout + +\end_inset + +- Follow the C89 standard and disable SDCC features that conflict with the + standard. +\end_layout + +\begin_layout Itemize + +\series bold +std_sdcc99 +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma std +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sdcc99 +\end_layout + +\end_inset + +- Generally follow the C99 standard, but allow SDCC features that conflict + with the standard. +\end_layout + +\begin_layout Itemize + +\series bold +std_c99 +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma std +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +c99 +\end_layout + +\end_inset + +- Follow the C99 standard and disable SDCC features that conflict with the + standard. +\end_layout + +\begin_layout Itemize + +\series bold +codeseg +\series default + <name> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma codeseg +\end_layout + +\end_inset + +- Use this name (max. + 8 characters) for the code segment. + See option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-codeseg. +\end_layout + +\begin_layout Itemize + +\series bold +constseg +\series default + <name> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma constseg +\end_layout + +\end_inset + +- Use this name (max. + 8 characters) for the const segment. + See option - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-constseg. +\end_layout + +\begin_layout Standard +The preprocessor +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Preprocessor +\end_layout + +\end_inset + + SDCPP +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdcpp (preprocessor) +\end_layout + +\end_inset + + supports the following #pragma directives: +\end_layout + +\begin_layout Itemize + +\series bold +pedantic_parse_number +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +pedantic +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma pedantic +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +parse +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +number +\end_layout + +\end_inset + + (+ | -) +\begin_inset CommandInset label +LatexCommand label +name "ite:pedantic_parse_number" + +\end_inset + +- 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. + See also the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pedantic-parse-number command line option +\begin_inset CommandInset ref +LatexCommand vpageref +reference "lyx:-pedantic-parse-number" + +\end_inset + +. + +\begin_inset Newline newline +\end_inset + +Below is an example on how to use this pragma. + +\emph on +Note: this functionality is not in conformance with standard! +\end_layout + +\begin_layout Verse + +\family typewriter +#pragma pedantic_parse_number + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma pedantic +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +parse +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +number +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +#define LO_B(x) ((x) & 0xff) +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +unsigned char foo(void) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +unsigned char c=0xfe-LO_B(3); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return c; +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +preproc_asm +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma preproc +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + (+ | -) - switch the __asm __endasm block preprocessing on / off. + Default is on. + Below is an example on how to use this pragma. +\end_layout + +\begin_layout Verse + +\family typewriter +#pragma preproc_asm - +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma preproc +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +asm +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +/* this is a c code nop */ +\begin_inset Newline newline +\end_inset + +#define NOP ; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void foo (void) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +while (--i) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +NOP +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__asm +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; this is an assembler nop instruction +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; it is not preprocessed to ';' since the asm preprocessing is disabled +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +NOP +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +__endasm; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Verse +The pragma preproc_asm should not be used to define multilines of assembly + code (even if it supports it), since this behavior is only a side effect + of sdcpp __asm __endasm implementation in combination with pragma preproc_asm + and is not in conformance with the C standard. + This behavior might be changed in the future sdcpp versions. + To define multilines of assembly code you have to include each assembly + line into it's own __asm __endasm block. + Below is an example for multiline assembly defines. +\end_layout + +\begin_layout Verse + +\family typewriter +#define Nop __asm +\backslash + +\begin_inset Newline newline +\end_inset + +nop +\backslash + +\begin_inset Newline newline +\end_inset + +__endasm +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +#define ThreeNops Nop; +\backslash + +\begin_inset Newline newline +\end_inset + +Nop; +\backslash + +\begin_inset Newline newline +\end_inset + +Nop +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void foo (void) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ThreeNops; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +sdcc_hash +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma sdcc +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +hash +\end_layout + +\end_inset + + (+ | -) - Allow "naked" hash in macro definition, for example: +\begin_inset Newline newline +\end_inset + + +\family typewriter +#define DIR_LO(x) #(x & 0xff) +\family default + +\begin_inset Newline newline +\end_inset + +Default is off. + Below is an example on how to use this pragma. +\end_layout + +\begin_layout Verse + +\family typewriter +#pragma preproc_asm + +\begin_inset Newline newline +\end_inset + +#pragma sdcc_hash + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma sdcc +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +hash +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +#define ROMCALL(x) +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov R6_B3, #(x & 0xff) +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov R7_B3, #((x >> 8) & 0xff) +\backslash + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +lcall __romcall +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +... +\begin_inset Newline newline +\end_inset + +__asm +\begin_inset Newline newline +\end_inset + +ROMCALL(72) +\begin_inset Newline newline +\end_inset + +__endasm; +\begin_inset Newline newline +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +Some of the pragmas are intended to be used to turn-on or off certain optimizati +ons which might cause the compiler to generate extra stack and/or 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 and optimizations for a given function. + +\end_layout + +\begin_layout Verse + +\family typewriter +#pragma save +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma save +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* save the current settings */ +\begin_inset Newline newline +\end_inset + +#pragma nogcse +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma nogcse +\end_layout + +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* turnoff global subexpression elimination */ +\begin_inset Newline newline +\end_inset + +#pragma noinduction +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noinduction +\end_layout + +\end_inset + + /* turn off induction optimizations */ +\begin_inset Newline newline +\end_inset + +int foo () +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + /* large code */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + ... +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + +#pragma restore +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma restore +\end_layout + +\end_inset + + /* turn the optimizations back on */ +\end_layout + +\begin_layout Standard +The compiler will generate a warning message when extra space is allocated. + It is strongly recommended that the save and restore pragmas be used when + changing options for a function. +\end_layout + +\begin_layout Section +Defines Created by the Compiler +\end_layout + +\begin_layout Standard +Besides defines from the C standards, the compiler creates the following + #defines +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +defines +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Defines created by the compiler +\end_layout + +\end_inset + +: +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="20" columns="2"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top" width="3in"> +<column alignment="left" valignment="top" width="3in"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +#define +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!__SDCC (version macro) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +version macro +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Always defined. + Version number string (e.g. + SDCC_3_2_0 for sdcc 3.2.0). +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SDCC +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +OBSOLETE. + WILL BE REMOVED IN THE FUTURE. + CURRENTLY Only defined for the mcs51 backend (and only if –std-cXX is not + used). + This macro has been available since SDCC 2.5.6 and is the version number + as an int (ex. + 256). + PLEASE USE OTHER VERSION MACROS INSTEAD! +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_mcs51 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!__SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +mcs51 +\end_layout + +\end_inset + + or __SDCC_ds390 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!__SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +ds390 +\end_layout + +\end_inset + + or __SDCC_z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!__SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +z80 +\end_layout + +\end_inset + +, etc. +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +depending on the model used (e.g.: -mds390). + Older versions used SDCC_mcs51, etc instead. + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_STACK_AUTO +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +STACK +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +AUTO +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto +\emph default + option is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_MODEL_SMALL +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MODEL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +SMALL +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-small +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_MODEL_MEDIUM +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MODEL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MEDIUM +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-medium +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_MODEL_LARGE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MODEL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LARGE +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-large +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_MODEL_HUGE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MODEL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LARGE +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-model-huge +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_USE_XSTACK +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +USE +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +XSTACK +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-xstack +\emph default + option is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_STACK_TENBIT +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +STACK +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +TENBIT (ds390) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +-mds390 +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_MODEL_FLAT24 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MODEL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +FLAT24 (ds390) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +-mds390 +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_VERSION_MAJOR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Always defined. + SDCC major version number. + E.g. + 3 for SDCC 3.5.0 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_VERSION_MINOR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Always defined. + SDCC minor version number. + E.g. + 5 for SDCC 3.5.0 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_VERSION_PATCH +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Always defined. + SDCC patchlevel version number. + E.g. + 0 for SDCC 3.5.0 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_REVISION +\begin_inset Index idx +status open + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +REVISION (svn revision number) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Always defined. + SDCC svn revision number. + Older versions of sdcc used SDCC_REVISION instead. +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SDCC_PARMS_IN_BANK1 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +PARMS +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +IN +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +BANK1 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-parms-in-bank1 +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_ALL_CALLEE_SAVES +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +ALL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +CALLEE +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +SAVES +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-all-callee-saves +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_FLOAT_REENT +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +FLOAT +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +REENT +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-float-reent +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_INT_LONG_REENT +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +INT +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LONG +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +REENT +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +when +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-int-long-reent +\emph default + is used +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Chapter +Notes on supported Processors +\end_layout + +\begin_layout Section +MCS51 variants +\begin_inset CommandInset label +LatexCommand label +name "subsec:MCS51-variants" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MCS51 variants +\end_layout + +\end_inset + + +\end_layout + +\begin_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. + +\end_layout + +\begin_layout Subsection +pdata access by SFR +\end_layout + +\begin_layout Standard +With the upcome of devices with internal xdata and flash memory devices + using port P2 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +P2 (mcs51 sfr) +\end_layout + +\end_inset + + as dedicated I/O port is becoming more popular. + Switching the high byte for __pdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pdata (mcs51, ds390 named address space) +\end_layout + +\end_inset + + access which was formerly done by port P2 is then achieved by a Special + Function Register +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sfr +\end_layout + +\end_inset + +. + 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 Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +XPAGE (mcs51) +\end_layout + +\end_inset + + +\family default + at the appropriate location if the default, port P2, is not used for this. + Some examples are: +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at (0x85) _XPAGE; /* Ramtron VRS51 family a.k.a. + MPAGE */ +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at (0x92) _XPAGE; /* Cypress EZ-USB family, Texas Instruments (Chipcon) + a.k.a. + MPAGE */ +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at (0x91) _XPAGE; /* Infineon (Siemens) C500 family a.k.a. + XPAGE */ +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at (0xaf) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a. + EMI0CN */ +\end_layout + +\begin_layout Verse + +\family typewriter +__sfr __at (0xaa) _XPAGE; /* some Silicon Labs (Cygnal) chips a.k.a. + EMI0CN */ +\end_layout + +\begin_layout Standard +There are also devices without anything resembling _XPAGE, but luckily they + usually have dual data-pointers. + For these devices a different method can be used to correctly initialize + xdata variables. + A default implementation is already in crtxinit.asm but it needs to be assembled + manually with DUAL_DPTR set to 1. +\end_layout + +\begin_layout Standard +For more exotic implementations further customizations may be needed. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:MCS51-Startup-Code" + +\end_inset + + for other possibilities. +\end_layout + +\begin_layout Subsection +Other Features available by SFR +\end_layout + +\begin_layout Standard +Some MCS51 variants offer features like Dual DPTR +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DPTR +\end_layout + +\end_inset + +, 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. +\end_layout + +\begin_layout Subsection +Bankswitching +\begin_inset CommandInset label +LatexCommand label +name "subsec:Bankswitching" + +\end_inset + + +\end_layout + +\begin_layout Standard +Bankswitching +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Bankswitching +\end_layout + +\end_inset + + (a.k.a. + code banking +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +code banking +\end_layout + +\end_inset + +) is a technique to increase the code space above the 64k limit of the 8051. +\end_layout + +\begin_layout Subsubsection +Hardware +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="4"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell multicolumn="1" alignment="center" valignment="top" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8000-FFFF +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +bank1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +bank2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +bank3 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell multicolumn="1" alignment="center" valignment="top" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0000-7FFF +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +common +\end_layout + +\end_inset +</cell> +<cell multicolumn="1" alignment="center" valignment="top" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell multicolumn="1" alignment="center" valignment="top" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SiLabs C8051F120 example +\end_layout + +\end_inset +</cell> +<cell multicolumn="2" alignment="center" valignment="top" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Usually the hardware uses some sfr (an output port or an internal sfr) to + select a bank and put it in the banked area of the memory map. + The selected bank usually becomes active immediately upon assignment to + this sfr and when running inside a bank it will switch out this code it + is currently running. + Therefor you cannot jump or call directly from one bank to another and + need to use a so-called trampoline in the common area. + For SDCC an example trampoline is in crtbank.asm and you may need to change + it to your 8051 derivative or schematic. + The presented code is written for the C8051F120. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +When calling a banked function SDCC will put the LSB of the functions address + in register R0, the MSB in R1 and the bank in R2 and then call this trampoline + +\emph on +__sdcc_banked_call +\emph default +. + The current selected bank is saved on the stack, the new bank is selected + and an indirect jump is made. + When the banked function returns it jumps to +\emph on +__sdcc_banked_ret +\emph default + which restores the previous bank and returns to the caller. +\end_layout + +\begin_layout Subsubsection +Software +\end_layout + +\begin_layout Standard +When writing banked software using SDCC you need to use some special keywords + and options. + You also need to take over a bit of work from the linker. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +To create a function that can be called from another bank it requires the + keyword +\emph on +__banked +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +banked +\end_layout + +\end_inset + +. + The caller must see this in the prototype of the callee and the callee + needs it for a proper return. + Called functions within the same bank as the caller do not need the +\emph on +__banked +\emph default + keyword nor do functions in the common area. + Beware: SDCC does not know or check if functions are in the same bank. + This is your responsibility! +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Normally all functions you write end up in the segment CSEG. + If you want a function explicitly to reside in the common area put it in + segment HOME. + This applies for instance to interrupt service routines as they should + not be banked. +\end_layout + +\begin_layout Standard +Functions that need to be in a switched bank must be put in a named segment. + The name can be mostly anything up to eight characters (e.g. + BANK1). + To do this you either use - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-codeseg BANK1 (See +\begin_inset CommandInset ref +LatexCommand ref +reference "lyx:-codeseg" + +\end_inset + +) on the command line when compiling or #pragma codeseg BANK1 (See +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Pragmas" + +\end_inset + +) at the top of the C source file. + The segment name always applies to the whole source file and generated + object so functions for different banks need to be defined in different + source files. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +When linking your objects you need to tell the linker where to put your + segments. + To do this you use the following command line option to SDCC: -Wl-b BANK1=0x180 +00 (See +\begin_inset CommandInset ref +LatexCommand ref +reference "lyx:-Wl option" + +\end_inset + +). + This sets the virtual start address of this segment. + It sets the banknumber to 0x01 and maps the bank to 0x8000 and up. + The linker will not check for overflows, again this is your responsibility. +\end_layout + +\begin_layout Subsection +MCS51/DS390 Startup Code +\begin_inset CommandInset label +LatexCommand label +name "subsec:MCS51-Startup-Code" + +\end_inset + + +\end_layout + +\begin_layout Standard +The compiler triggers the linker to link certain initialization modules + from the runtime library +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Runtime library +\end_layout + +\end_inset + + called crt<something>. + Only the necessary ones are linked, for instance crtxstack.asm (GSINIT1, + GSINIT5) is not linked unless the - +\series bold + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series default +-xstack option is used. + These modules are highly entangled by the use of special segments/areas, + but a common layout is shown below: +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(main.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area HOME (CODE) +\begin_inset Newline newline +\end_inset + +__interrupt_vect: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ljmp __sdcc_gsinit_startup +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtstart.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT0 (CODE) +\begin_inset Newline newline +\end_inset + +__sdcc_gsinit_startup:: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov sp,#__start__stack - 1 +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtxstack.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT1 (CODE) +\begin_inset Newline newline +\end_inset + +__sdcc_init_xstack:: +\begin_inset Newline newline +\end_inset + +; Need to initialize in GSINIT1 in case the user's __sdcc_external_startup + uses the xstack. +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov __XPAGE,#(__start__xstack >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov _spx,#__start__xstack +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtstart.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT2 (CODE) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +lcall __sdcc_external_startup +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,dpl +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jz __sdcc_init_data +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ljmp __sdcc_program_startup +\begin_inset Newline newline +\end_inset + +__sdcc_init_data: +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtxinit.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT3 (CODE) +\begin_inset Newline newline +\end_inset + +__mcs51_genXINIT:: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r1,#l_XINIT +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r1 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +orl a,#(l_XINIT >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jz 00003$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r2,#((l_XINIT+255) >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dptr,#s_XINIT +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,#s_XISEG +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov __XPAGE,#(s_XISEG >> 8) +\begin_inset Newline newline +\end_inset + +00001$: +\begin_inset space ~ +\end_inset + +clr a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movc a,@a+dptr +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx @r0,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc dptr +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc r0 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +cjne r0,#0,00002$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc __XPAGE +\begin_inset Newline newline +\end_inset + +00002$: +\begin_inset space ~ +\end_inset + +djnz r1,00001$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +djnz r2,00001$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov __XPAGE,#0xFF +\begin_inset Newline newline +\end_inset + +00003$: +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtclear.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT4 (CODE) +\begin_inset Newline newline +\end_inset + +__mcs51_genRAMCLEAR:: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +clr a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,#(l_IRAM-1) +\begin_inset Newline newline +\end_inset + +00004$: +\begin_inset space ~ +\end_inset + +mov @r0,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +djnz r0,00004$ +\begin_inset Newline newline +\end_inset + +; _mcs51_genRAMCLEAR() end +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtxclear.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT4 (CODE) +\begin_inset Newline newline +\end_inset + +__mcs51_genXRAMCLEAR:: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,#l_PSEG +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r0 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +orl a,#(l_PSEG >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jz 00006$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r1,#s_PSEG +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov __XPAGE,#(s_PSEG >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +clr a +\begin_inset Newline newline +\end_inset + +00005$: +\begin_inset space ~ +\end_inset + +movx @r1,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc r1 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +djnz r0,00005$ +\begin_inset Newline newline +\end_inset + +00006$: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,#l_XSEG +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r0 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +orl a,#(l_XSEG >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jz 00008$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r1,#((l_XSEG + 255) >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dptr,#s_XSEG +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +clr a +\begin_inset Newline newline +\end_inset + +00007$: +\begin_inset space ~ +\end_inset + +movx @dptr,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc dptr +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +djnz r0,00007$ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +djnz r1,00007$ +\begin_inset Newline newline +\end_inset + +00008$: +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(crtxstack.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT5 (CODE) +\begin_inset Newline newline +\end_inset + +; Need to initialize in GSINIT5 because __mcs51_genXINIT modifies __XPAGE +\begin_inset Newline newline +\end_inset + +; and __mcs51_genRAMCLEAR modifies _spx. +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov __XPAGE,#(__start__xstack >> 8) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov _spx,#__start__xstack +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(application modules) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSINIT (CODE) +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +\size footnotesize +(main.asm) +\end_layout + +\begin_layout Verse + +\family typewriter +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area GSFINAL (CODE) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ljmp __sdcc_program_startup +\begin_inset Newline newline +\end_inset + +;-------------------------------------------------------- +\begin_inset Newline newline +\end_inset + +; Home +\begin_inset Newline newline +\end_inset + +;-------------------------------------------------------- +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area HOME (CODE) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area CSEG (CODE) +\begin_inset Newline newline +\end_inset + +__sdcc_program_startup: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +lcall _main +\begin_inset Newline newline +\end_inset + +; return from main will lock up +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sjmp . +\end_layout + +\begin_layout Standard +One of these modules (crtstart.asm) contains a call to the C routine +\emph on +_sdcc_external_startup() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +sdcc +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +external +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +startup() +\end_layout + +\end_inset + + +\emph default + at the start of the CODE area. + This routine is also in the runtime library +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Runtime library +\end_layout + +\end_inset + + 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 Index idx +status collapsed + +\begin_layout Plain Layout +Variable initialization +\end_layout + +\end_inset + +. + On some mcs51 variants __xdata +\begin_inset Index idx +status open + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +xdata (mcs51, ds390 named address space +\end_layout + +\end_inset + + memory has to be explicitly enabled before it can be accessed or if the + watchdog +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +watchdog +\end_layout + +\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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-iram-size +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-iram-size <Value> +\end_layout + +\end_inset + +n +\emph default + is used. + (recommended for Chipcon CC1010). +\end_layout + +\begin_layout Standard +See also the compiler option +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-xinit +\emph default +- +\emph on +opt +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-xinit-opt +\end_layout + +\end_inset + + and section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:MCS51-variants" + +\end_inset + + about MCS51-variants. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +While these initialization modules are meant as generic startup code there + might be the need for customization. + Let's assume the return value of +\emph on +_sdcc_external_startup() +\emph default + in +\emph on +crtstart.asm +\emph default + should not be checked (or +\emph on +_sdcc_external_startup() +\emph default + should not be called at all). + The recommended way would be to copy +\emph on +crtstart.asm +\emph default + (f.e. + from +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/device/lib/mcs51/crtstart.asm +\end_layout + +\end_inset + +) into the source directory, adapt it there, then assemble it with +\emph on +sdas8051 -plosgff +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +\begin_inset Quotes sld +\end_inset + +-plosgff +\begin_inset Quotes srd +\end_inset + + are the assembler options used in +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/device/lib/mcs51/Makefile.in? +view=markup +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + crtstart.asm +\emph default + and when linking your project explicitly specify +\emph on +crtstart.rel +\emph default +. + As a bonus a listing of the relocated object file +\emph on +crtstart.rst +\emph default + is generated. +\end_layout + +\begin_layout Subsection +Interfacing with Assembler Code +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler routines +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsubsection +Global Registers used for Parameter Passing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Parameter passing +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The compiler always uses the global registers +\emph on +DPL, DPH +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DPTR, DPH, DPL +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DPTR +\end_layout + +\end_inset + +, B +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +B (mcs51, ds390 register) +\end_layout + +\end_inset + + +\emph default + and +\emph on +ACC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +ACC (mcs51, ds390 register) +\end_layout + +\end_inset + + +\emph default + to pass the first (non-bit) parameter to a function, and also to pass the + return value +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +return value +\end_layout + +\end_inset + +of function; according to the following scheme: one byte return value in + +\emph on +DPL +\emph default +, two byte value in +\emph on +DPL +\emph default + (LSB) and +\emph on +DPH +\emph default + (MSB). + three byte values (generic pointers) in +\emph on +DPH +\emph default +, +\emph on +DPL +\emph default + and +\emph on +B +\emph default +, and four byte values in +\emph on +DPH +\emph default +, +\emph on +DPL +\emph default +, +\emph on +B +\emph default + and +\emph on +ACC +\emph default +. + Generic pointers +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +generic pointer +\end_layout + +\end_inset + + contain type of accessed memory in +\emph on +B +\emph default +: +\series bold +0x00 +\series default + – xdata/far, +\series bold +0x40 +\series default + – idata/near – , +\series bold +0x60 +\series default + – pdata, +\series bold +0x80 +\series default + – code +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +This might not be the case of certain memory models (medium???) +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Standard +The second parameter onwards is either allocated on the stack (for reentrant + routines or if - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-auto is used) or in data/xdata memory (depending on the memory model). +\end_layout + +\begin_layout Standard +Bit parameters are passed in a virtual register called 'bits' in bit-addressable + space for reentrant functions or allocated directly in bit memory otherwise. +\end_layout + +\begin_layout Standard +Functions (with two or more parameters or bit parameters) that are called + through function pointers +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function pointers +\end_layout + +\end_inset + + must therefor be reentrant so the compiler knows how to pass the parameters. +\end_layout + +\begin_layout Subsubsection +Register usage +\end_layout + +\begin_layout Standard +Unless the called function is declared as +\family typewriter +_naked +\family default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +naked +\end_layout + +\end_inset + +, or the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves +\end_layout + +\end_inset + +/- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-all-callee-saves command line option or the corresponding callee_saves + pragma are used, the caller will save the registers ( +\emph on +R0-R7 +\emph default +) around the call, so the called function can destroy they content freely. +\end_layout + +\begin_layout Standard +If the called function is not declared as +\family typewriter +_naked +\family default +, the caller will swap register banks around the call, if caller and callee + use different register banks (having them defined by the +\family typewriter +__using +\family default + modifier). + +\end_layout + +\begin_layout Standard +The called function can also use +\emph on +DPL +\emph default +, +\emph on +DPH +\emph default +, +\emph on +B +\emph default + and +\emph on +ACC +\emph default + observing that they are used for parameter/return value passing. +\end_layout + +\begin_layout Subsubsection +Assembler Routine (non-reentrant) +\end_layout + +\begin_layout Standard +In the following example +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler routines (non-reentrant) +\end_layout + +\end_inset + + the function c_func calls an assembler routine asm_func, which takes two + parameters +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function parameter +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Verse + +\family typewriter +extern int asm_func(unsigned char, unsigned char); +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +int c_func (unsigned char i, unsigned char j) +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return asm_func(i,j); +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +int main() +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return c_func(10,9); +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +The corresponding assembler function is: +\end_layout + +\begin_layout Verse + +\family typewriter +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.globl _asm_func_PARM_2 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.globl _asm_func +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area OSEG +\begin_inset Newline newline +\end_inset + +_asm_func_PARM_2: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.ds 1 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.area CSEG +\begin_inset Newline newline +\end_inset + +_asm_func: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,dpl +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,_asm_func_PARM_2 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dpl,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dph +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DPTR, DPH, DPL +\end_layout + +\end_inset + +,#0x00 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ret +\end_layout + +\begin_layout Standard +The parameter naming convention is _<function_name>_PARM_<n>, where n is + the parameter number starting from 1, and counting from the left. + The first parameter is passed in +\emph on +DPH +\emph default +, +\emph on +DPL +\emph default +, +\emph on +B +\emph default + and +\emph on +ACC +\emph default + according to the description above. + The variable name for the second parameter will be _<function_name>_PARM_2. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Assemble the assembler routine with the following command: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdas8051 -losg asmfunc.asm +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family default +\series default +Then compile and link the assembler routine to the C source file with the + following command: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcc cfunc.c asmfunc.rel +\end_layout + +\begin_layout Subsubsection +Assembler Routine (reentrant) +\end_layout + +\begin_layout Standard +In this case +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +reentrant +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler routines (reentrant) +\end_layout + +\end_inset + + the second parameter +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +function parameter +\end_layout + +\end_inset + + onwards will be passed on the stack, the parameters are pushed from right + to left i.e. + before the call the second leftmost parameter will be on the top of the + stack (the leftmost parameter is passed in registers). + Here is an example: +\end_layout + +\begin_layout Verse + +\family typewriter +extern int asm_func(unsigned char, unsigned char, unsigned char) reentrant; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +int c_func (unsigned char i, unsigned char j, unsigned char k) reentrant + +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return asm_func(i,j,k); +\begin_inset Newline newline +\end_inset + +} +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +int main() +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return c_func(10,9,8); +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +The corresponding (unoptimized) assembler routine is: +\end_layout + +\begin_layout Verse + +\family typewriter +.globl _asm_func +\begin_inset Newline newline +\end_inset + +_asm_func: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push +\begin_inset space ~ +\end_inset + +_bp +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_bp,sp +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +;stack contains: _bp, return address, second parameter, third parameter +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r2,dpl +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,_bp +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,#0xfd +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +;calculate pointer to the second parameter +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r0,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,_bp +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,#0xfc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +;calculate pointer to the rightmost parameter +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +r1,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,@r0 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,@r1 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,r2 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +;calculate the result (= sum of all three parameters) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dpl,a +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +;return value goes into dptr (cast into int) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dph,#0x00 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sp,_bp +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_bp +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ret +\end_layout + +\begin_layout Standard +The compiling and linking procedure remains the same, however note the extra + entry & exit linkage required for the assembler code, _bp is the stack + frame pointer and is used to compute the offset into the stack for parameters + and local variables. +\end_layout + +\begin_layout Section +DS400 port +\end_layout + +\begin_layout Standard +The DS80C400 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS80C400 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS400 +\end_layout + +\end_inset + + 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 Flex URL +status collapsed + +\begin_layout Plain Layout + +ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html +\end_layout + +\end_inset + +. + +\end_layout + +\begin_layout Section +The Z80, Z180, Rabbit 2000/3000, Rabbit 3000A, GBZ80, eZ80 and TLCS-90 ports +\end_layout + +\begin_layout Standard +SDCC can target the Z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80 +\end_layout + +\end_inset + +, Z180, Rabbit 2000/3000, Rabbit 3000A and LR35902, the Nintendo GameBoy's + Z80-like gbz80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gbz80 (GameBoy Z80) +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Standard +When a frame pointer is used, it resides in IX. + Register A, B, C, D, E, H, L and IY are used as a temporary registers for + holding variables. + Return values +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80!return value +\end_layout + +\end_inset + + 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). +\end_layout + +\begin_layout Standard +When enabling optimizations using +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--opt-code +\end_layout + +\end_inset + + size and a sufficiently high value for +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--max-allocs-per-node +\end_layout + +\end_inset + + sdcc typically generates much better code for these architectures than + many other compilers. + A comparison of compilers for these architecture can be found at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/index.php/Z80_code_size +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Startup Code +\end_layout + +\begin_layout Standard +On the Z80 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Z80 +\end_layout + +\end_inset + + the startup code is inserted by linking with crt0.rel 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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\series default +\emph on +-no-std-crt0 +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-std-crt0 +\end_layout + +\end_inset + + and provide your own crt0.rel. + When using a custom crt0.rel it needs to be listed first when linking. +\end_layout + +\begin_layout Subsection +Complex instructions +\end_layout + +\begin_layout Standard +The Z80 and some derivatives support complex instructions, such as ldir, + cpir, ... + . + SDCC only emits these instructions for functions in the standard library. + Thus, e.g. + copying one array into another is more efficient when using memcpy() than + by using a a user-written loop. +\end_layout + +\begin_layout Standard +Depending on the target, code generation options and the parameters to the + call, SDCC emits ldir for memcpy(), ldir or lsidr for memset(), ldi for + strcpy(), ldi for strncpy(). + Other library functions use the complex instructions as well, but for those, + function calls are generated. +\end_layout + +\begin_layout Subsection +Calling conventions +\end_layout + +\begin_layout Standard +By default, all parameters are passed on the stack, right-to-left. + 8-bit return values are passed in l, 16-bit values in hl, 32-bit values + in dehl. + Except for the GBZ80, where 8-bit values are passed in e, 16-bit values + in de, 32-bit values in hlde. + Larger return values are passed in memory in a location specified by the + caller through a hidden pointer argument. +\end_layout + +\begin_layout Standard +There are three other calling conventions supported, which can be specified + using the keywords __smallc, __z88dk_fastcall (not on GBZ80) and __z88dk_callee. + They are primarily intended for compability with libraries written for + other compilers. + For __z88dk_fastcall, there may be only one parameter of at most 32 bits, + which is passed the same way as the return value. + For __z88dk_callee, parameters are passed on the stack, but the stack is + not adjusted for the parameters after the call (thus the callee has to + do this instead). + __z88dk_callee is currently supported on the caller side only. + __z88dk_callee can be combined with __smallc. +\end_layout + +\begin_layout Subsection +Small-C calling convention +\end_layout + +\begin_layout Standard +Functions declared as __smallc are called using the Small-C calling convention + (passing arguments on-stack left-to-right, 1 byte arguments are passed + as 2 bytes, with the value in the lower byte). + This way assembler routines originally written for Small-C or code generated + by Small-C can be called from SDCC. + Currently variable arguments are not yet supported (neither on the caller + nor on the callee side). +\end_layout + +\begin_layout Subsection +Unsafe reads +\end_layout + +\begin_layout Standard +Usually, Z80-based systems (except for the Gameboy) have separate I/O and + memory spaces, and any memory location can be read without side-effects. + For such systems, the option –allow-unsafe-reads can be used to enable + some extra optimizations. +\end_layout + +\begin_layout Section +The HC08 and S08 ports +\end_layout + +\begin_layout Standard +The port to the Freescale/Motorola HC08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08 +\end_layout + +\end_inset + + and S08 does not yet generate code as compact as that generated by some + non-free compilers. + A comparison of compilers for these architecture can be found at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/index.php/Hc08_code_size +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsection +Startup Code +\end_layout + +\begin_layout Standard +The HC08 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +HC08 +\end_layout + +\end_inset + + startup code follows the same scheme as the MCS51 startup code. +\end_layout + +\begin_layout Section +The STM8 port +\end_layout + +\begin_layout Subsection +Calling convention +\end_layout + +\begin_layout Standard +Arguments are passed on the stack right-to-left. + Return values are in a (8 bit), x (16 bit), xyl (24 bit), xy (32 bit) or + use a hidden extra pointer parameter pointing to the location (anything + wider than 32 bit). +\end_layout + +\begin_layout Section +The PIC14 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14 +\end_layout + +\end_inset + + port +\end_layout + +\begin_layout Standard +The PIC14 port adds support for Microchip +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Microchip +\end_layout + +\end_inset + + +\begin_inset Formula $^{\text{TM}}$ +\end_inset + + PIC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14 +\end_layout + +\end_inset + + +\begin_inset Formula $^{\text{TM}}$ +\end_inset + + MCUs with 14 bit wide instructions. + This port is not yet mature and still lacks many features. + However, it can work for simple code. +\end_layout + +\begin_layout Standard +\noindent +Currently supported devices include: +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +10F320, 10F322, 10LF320, 10LF322 +\end_layout + +\begin_layout Standard +12F609, 12F615, 12F617, 12F629, 12F635, 12F675, 12F683 +\end_layout + +\begin_layout Standard +12F752 +\end_layout + +\begin_layout Standard +12HV752 +\end_layout + +\begin_layout Standard +16C62, 16C63A, 16C65B +\end_layout + +\begin_layout Standard +16C71, 16C72, 16C73B, 16C74B +\end_layout + +\begin_layout Standard +16C432, 16C433 +\end_layout + +\begin_layout Standard +16C554, 16C557, 16C558 +\end_layout + +\begin_layout Standard +16C620, 16C620A, 16C621, 16C621A, 16C622, 16C622A +\end_layout + +\begin_layout Standard +16C710, 16C711, 16C715, 16C717, 16C745, 16C765, 16C770, 16C771, 16C773, + 16C774, 16C781, 16C782 +\end_layout + +\begin_layout Standard +16C925, 16C926 +\end_layout + +\begin_layout Standard +16CR73, 16CR74, 16CR76, 16CR77 +\end_layout + +\begin_layout Standard +16CR620A +\end_layout + +\begin_layout Standard +16F72 ,16F73, 16F74, 16F76, 16F77 +\end_layout + +\begin_layout Standard +16F84, 16F84A, 16F87, 16F88 +\end_layout + +\begin_layout Standard +16F610, 16F616, 16F627, 16F627A, 16F628, 16F628A, 16F630, 16F631, 16F636, + 16F639, 16F648A +\end_layout + +\begin_layout Standard +16F676, 16F677, 16F684, 16F685, 16F687, 16F688, 16F689, 16F690 +\end_layout + +\begin_layout Standard +16F707, 16F716, 16F720, 16F721, 16F722, 16F722A, 16F723, 16F723A, 16F724, + 16F726, 16F727 +\end_layout + +\begin_layout Standard +16F737, 16F747, 16F753, 16F767, 16F777, 16F785 +\end_layout + +\begin_layout Standard +16F818, 16F819, 16F870, 16F871, 16F872, 16F873, 16F873A, 16F874, 16F874A, + 16F876, 16F876A +\end_layout + +\begin_layout Standard +16F877, 16F877A, 16F882, 16F883, 16F884, 16F886, 16F887 +\end_layout + +\begin_layout Standard +16F913, 16F914, 16F916, 16F917, 16F946 +\end_layout + +\begin_layout Standard +16LF74, 16LF76, 16LF77 +\end_layout + +\begin_layout Standard +16LF84, 16LF84A, 16LF87, 16LF88 +\end_layout + +\begin_layout Standard +16LF627, 16LF627A, 16LF628, 16LF628A, 16LF648A +\end_layout + +\begin_layout Standard +16LF707, 16LF720, 16LF721, 16LF722, 16LF722A, 16LF723, 16LF723A, 16LF724, + 16LF726, 16LF727 +\end_layout + +\begin_layout Standard +16LF747, 16LF767, 16LF777 +\end_layout + +\begin_layout Standard +16LF818, 16LF819, 16LF870, 16LF871, 16LF872, 16LF873, 16LF873A, 16LF874, + 16LF874A +\end_layout + +\begin_layout Standard +16LF876, 16LF876A, 16LF877, 16LF877A +\end_layout + +\begin_layout Standard +16HV610, 16HV616, 16HV753, 16HV785 +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +\align left +Supported devices with enhanced cores: +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +12F1501, 12F1571, 12F1572, 12F1612, 12F1822, 12F1840 +\end_layout + +\begin_layout Standard +12LF1501, 12LF1552, 12LF1571, 12LF1572, 12LF1612, 12LF1822, 12LF1840, 12LF1840T3 +9A, 12LF1840T48A +\end_layout + +\begin_layout Standard +16F1454, 16F1455, 16F1458, 16F1459 +\end_layout + +\begin_layout Standard +16F1503, 16F1507, 16F1508, 16F1509, 16F1512, 16F1513, 16F1516, 16F1517, + 16F1518, 16F1519 +\end_layout + +\begin_layout Standard +16F1526, 16F1527, 16F1574, 16F1575, 16F1578, 16F1579 +\end_layout + +\begin_layout Standard +16F1613, 16F1614, 16F1615, 16F1618, 16F1619 +\end_layout + +\begin_layout Standard +16F1703, 16F1704, 16F1705, 16F1707, 16F1708, 16F1709, 16F1713, 16F1716, + 16F1717, 16F1718, 16F1719 +\end_layout + +\begin_layout Standard +16F1764, 16F1765, 16F1768, 16F1769, 16F1773, 16F1776, 16F1777, 16F1778, + 16F1779 +\end_layout + +\begin_layout Standard +16F1782, 16F1783, 16F1784, 16F1786, 16F1787, 16F1788, 16F1789 +\end_layout + +\begin_layout Standard +16F1823, 16F1824, 16F1825, 16F1826, 16F1827, 16F1828, 16F1829, 16F1829LIN, + 16F1847 +\end_layout + +\begin_layout Standard +16F1933, 16F1934, 16F1936, 16F1937, 16F1938, 16F1939, 16F1946, 16F1947 +\end_layout + +\begin_layout Standard +16F18313, 16F18323, 16F18324, 16F18325, 16F18344, 16F18345, +\end_layout + +\begin_layout Standard +16F18855, 16F18875 +\end_layout + +\begin_layout Standard +16LF1454, 16LF1455, 16LF1458, 16LF1459 +\end_layout + +\begin_layout Standard +16LF1503, 16LF1507, 16LF1508, 16LF1509, 16LF1512, 16LF1513, 16LF1516, 16LF1517, + 16LF1518, 16LF1519, +\end_layout + +\begin_layout Standard +16LF1526, 16LF1527 +\end_layout + +\begin_layout Standard +16LF1554, 16LF1559, 16LF1566, 16LF1567, 16LF1574, 16LF1575, 16LF1578, 16LF1579 +\end_layout + +\begin_layout Standard +16LF1613, 16LF1614, 16LF1615, 16LF1618, 16LF1619 +\end_layout + +\begin_layout Standard +16LF1703, 16LF1704, 16LF1705, 16LF1707, 16LF1708, 16LF1709, 16LF1713, 16LF1716, + 16LF1717, 16LF1718, 16LF1719 +\end_layout + +\begin_layout Standard +16LF1764, 16LF1765, 16LF1768, 16LF1769, 16LF1773, 16LF1776, 16LF1777, 16LF1778, + 16LF1779 +\end_layout + +\begin_layout Standard +16LF1782, 16LF1783, 16LF1784, 16LF1786, 16LF1787, 16LF1788, 16LF1789, +\end_layout + +\begin_layout Standard +16LF1823, 16LF1824, 16LF1824T39A +\end_layout + +\begin_layout Standard +16LF1825, 16LF1826, 16LF1827, 16LF1828, 16LF1829, 16LF1847 +\end_layout + +\begin_layout Standard +16LF1902, 16LF1903, 16LF1904, 16LF1906, 16LF1907 +\end_layout + +\begin_layout Standard +16LF1933, 16LF1934, 16LF1936, 16LF1937, 16LF1938, 16LF1939, 16LF1946, 16LF1947 +\end_layout + +\begin_layout Standard +16LF18313, 16LF18323, 16LF18324, 16LF18325, 16LF18344, 16LF18345 +\end_layout + +\begin_layout Standard +16LF18855, 16LF18875 +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +An up-to-date list of currently supported devices can be obtained via +\family typewriter +sdcc -mpic14 -phelp foo.c +\family default + (foo.c must exist...). +\end_layout + +\begin_layout Subsection +PIC Code Pages +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +code page (pic14) +\end_layout + +\end_inset + + and Memory Banks +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory bank (pic14) +\end_layout + +\end_inset + + +\end_layout + +\begin_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 assigns all +\emph on +static +\emph default + functions of a single .c file into the same code page. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +To get the best results, follow these guidelines: +\end_layout + +\begin_layout Enumerate +Make local functions static, as non static functions require code page selection + overhead. +\begin_inset Newline newline +\end_inset + +Due to the way sdcc handles functions, place called functions prior to calling + functions in the file wherever possible: Otherwise sdcc will insert unnecessary + pagesel directives around the call, believing that the called function + is externally defined. +\end_layout + +\begin_layout Enumerate +For devices that have multiple code pages it is more efficient to use the + same number of files as pages: Use up to 4 separate .c files for the 16F877, + but only 2 files for the 16F874. + This way the linker can put the code for each file into different code + pages and there will be less page selection overhead. +\end_layout + +\begin_layout Enumerate +And as for any 8 bit micro (especially for PIC14 as they have a very simple + instruction set), use `unsigned char' wherever possible instead of `int'. +\end_layout + +\begin_layout Subsection +Adding New Devices to the Port +\end_layout + +\begin_layout Standard +Adding support for a new 14 +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +, +\end_layout + +\end_inset + +bit PIC MCU requires the following steps: +\end_layout + +\begin_layout Enumerate +Create a new device description. +\begin_inset Newline newline +\end_inset + +Each device is described in two files: pic16f*.h and pic16f*.c. + These files primarily define SFRs, structs to access their bits, and symbolic + configuration options. + Both files can be generated from gputils' .inc files using the perl script + +\family typewriter +support/scripts/inc2h.pl +\family default +. + This file also contains further instructions on how to proceed. +\end_layout + +\begin_layout Enumerate +Copy the .h file into SDCC's include path and either add the .c file to your + project or copy it to +\family typewriter +device/lib/pic/libdev +\family default +. + Afterwards, rebuild and install the libraries. +\end_layout + +\begin_layout Enumerate +Edit pic14devices.txt in SDCC's include path ( +\family typewriter +device/include/pic/ +\family default + in the source tree or +\family typewriter +/usr/local/share/sdcc/include/pic +\family default + after installation). +\begin_inset Newline newline +\end_inset + +You need to add a device specification here to make the memory layout (code + banks, RAM, aliased memory regions, ...) known to the compiler. + Probably you can copy and modify an existing entry. + The file format is documented at the top of the file. +\end_layout + +\begin_layout Subsection +Interrupt Code +\end_layout + +\begin_layout Standard +For the interrupt function, use the keyword +\emph on +__interrupt +\emph default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!interrupt +\end_layout + +\end_inset + + 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.: +\end_layout + +\begin_layout Verse + +\family typewriter +void Intr(void) __interrupt 0 +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +T0IF = 0; /* Clear timer interrupt */ +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Subsection +Configuration Bits +\end_layout + +\begin_layout Standard +Configuration bits (also known as fuses) can be configured using ` +\family typewriter +__code +\family default +' and ` +\family typewriter +__at +\family default +' modifiers. + Possible options should be ANDed and can be found in your processor header + file. + Example for PIC16F88: +\end_layout + +\begin_layout LyX-Code + +\family typewriter +#include <pic16f88.h> //Contains config addresses and options +\begin_inset Newline newline +\end_inset + +#include <stdint.h> //Needed for uint16_t +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +static __code uint16_t __at (_CONFIG1) configword1 = _INTRC_IO & +\begin_inset Newline newline +\end_inset + + _CP_ALL & _WDT_OFF & [...]; +\begin_inset Newline newline +\end_inset + +static __code uint16_t __at (_CONFIG2) configword2 = [...]; +\end_layout + +\begin_layout Standard +Although data type is ignored if the address ( +\family typewriter +__at() +\family default +) refers to a config word location, using a type large enough for the configurat +ion word ( +\family typewriter +uint16_t +\family default + in this case) is recommended to prevent changes in the compiler (implicit, + early range check and enforcement) from breaking the definition. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +If your processor header file doesn't contain config addresses you can declare + it manually or use a literal address: +\end_layout + +\begin_layout LyX-Code + +\family typewriter +static __code uint16_t __at (0x2007) configword1 = _INTRC_IO & +\begin_inset Newline newline +\end_inset + + _CP_ALL & _WDT_OFF & [...]; +\end_layout + +\begin_layout Subsection +Linking and Assembling +\end_layout + +\begin_layout Standard +For assembling you can use either GPUTILS' +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gputils (pic tools) +\end_layout + +\end_inset + + gpasm.exe or MPLAB's mpasmwin.exe. + GPUTILS are available from +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/gputils +\end_layout + +\end_inset + +. + For linking you can use either GPUTILS' 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. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Pic device specific header and c source files are automatically generated + from MPLAB include files, which are published by Microchip with a special + requirement that they are only to be used with authentic Microchip devices. + This reqirement prevents to publish generated header and c source files + under the GPL compatible license, so they are located in non-free directory + (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Search-Paths" + +\end_inset + +). + In order to include them in include and library search paths, the +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + +\series default + command line option should be defined. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +NOTE: the compiled code, which use non-free pic device specific libraries, + is not GPL compatible! +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Here is a +\family typewriter +Makefile +\family default + using GPUTILS: +\end_layout + +\begin_layout Verse + +\family typewriter +.c.o: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcc -V --use-non-free -mpic14 -p16f877 -c $< +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +$(PRJ).hex: $(OBJS) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +gplink -m -s $(PRJ).lkr -o $(PRJ).hex $(OBJS) libsdcc.lib +\end_layout + +\begin_layout Standard +Here is a +\family typewriter +Makefile +\family default + using MPLAB: +\end_layout + +\begin_layout Verse + +\family typewriter +.c.o: +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcc -S -V --use-non-free -mpic14 -p16f877 $< +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mpasmwin /q /o $*.asm +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +$(PRJ).hex: $(OBJS) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mplink /v $(PRJ).lkr /m $(PRJ).map /o $(PRJ).hex $(OBJS) libsdcc.lib +\end_layout + +\begin_layout Standard +Please note that indentations within a +\family typewriter +Makefile +\family default + have to be done with a tabulator character. +\end_layout + +\begin_layout Subsection +Command-Line Options +\end_layout + +\begin_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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-help): +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug-xtra +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug-extra +\end_layout + +\end_inset + + emit debug info in assembly output +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pcode-opt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-pcode-opt +\end_layout + +\end_inset + + disable (slightly faulty) optimization on pCode +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-loc +\end_layout + +\end_inset + + sets the lowest address of the argument passing stack (defaults to a suitably + large shared databank to reduce BANKSEL overhead) +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-size +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-stack-size +\end_layout + +\end_inset + + sets the size if the argument passing stack (default: 16, minimum: 4) +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + make non-free device headers and libraries available in the compiler's + search paths (implicit -I and -L options) +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-extended-instructions forbid use of the extended instruction set (e.g., + ADDFSR) +\end_layout + +\begin_layout Subsection +Environment Variables +\end_layout + +\begin_layout Standard +The PIC14 port recognizes the following environment variables: +\end_layout + +\begin_layout Description +SDCC_PIC14_SPLIT_LOCALS +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14!Environment variables!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +PIC14 +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +SPLIT +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LOCALS +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +PIC14 +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +SPLIT +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +LOCALS +\end_layout + +\end_inset + + If set and not empty, sdcc will allocate each temporary register (the ones + called r0xNNNN) in a section of its own. + By default (if this variable is unset), sdcc tries to cluster registers + in sections in order to reduce the BANKSEL overhead when accessing them. +\end_layout + +\begin_layout Subsection +The Library +\end_layout + +\begin_layout Standard +The PIC14 library currently only contains support routines required by the + compiler to implement multiplication, division, and floating point support. + No libc-like replacement is available at the moment, though many of the + common sdcc library sources (in +\family typewriter +device/lib +\family default +) should also compile with the PIC14 port. +\end_layout + +\begin_layout Subsubsection +Enhanced cores +\end_layout + +\begin_layout Standard +SDCC/PIC14 has experimental support for devices with the enhanced 14-bit + cores (such as pic12f1822). + Due to differences in required code, the libraries provided with SDCC ( +\family typewriter +libm.lib +\family default + and +\family typewriter +libsdcc.lib +\family default +) are now provided in two variants: +\family typewriter +libm.lib +\family default + and +\family typewriter +libsdcc.lib +\family default + are compiled for the regular, non-enhanced devices. + +\family typewriter +libme.lib +\family default + and +\family typewriter +libsdcce.lib +\family default + (note the trailing ' +\family typewriter +e +\family default +') are compiled for enhanced devices. + When linking manually, make sure to select the proper variant! +\end_layout + +\begin_layout Standard +When SDCC is used to invoke the linker, SDCC will automatically select the + +\family typewriter +libsdcc.lib +\family default +-variant suitable for the target device. + However, no such magic has been conjured up for +\family typewriter +libm.lib +\family default +! +\end_layout + +\begin_layout Subsubsection +Accessing bits of special function registers +\end_layout + +\begin_layout Standard +Individual bits within SFRs can be accessed either using +\family typewriter +<sfrname>bits.<bitname> +\family default + or using a shorthand +\family typewriter +<bitname> +\family default +, which is defined in the respective device header for all +\family typewriter +<bitname> +\family default +s. + In order to avoid polluting the global namespace with the names of all + the bits, you can +\family typewriter +#define NO_BIT_DEFINES +\family default + before inclusion of the device header file. +\end_layout + +\begin_layout Subsubsection +Naming of special function registers +\begin_inset CommandInset label +LatexCommand label +name "subsec:Naming-of-special" + +\end_inset + + +\end_layout + +\begin_layout Standard +If +\family typewriter +NO_BIT_DEFINES +\family default + is used, individual bits of the SFRs can be accessed as +\family typewriter +<sfrname>bits.<bitname> +\family default +. + With the 3.1.0 release, the previously used +\family typewriter +<sfrname>_bits.<bitname> +\family default + (note the underscore) is deprecated. + This was done to align the naming conventions with the PIC16 port and competing + compiler vendors. + To avoid polluting the global namespace with the legacy names, you can + prevent their definition using +\family typewriter +#define NO_LEGACY_NAMES +\family default + prior to the inclusion of the device header. +\end_layout + +\begin_layout Standard +You +\family typewriter +\series bold +must +\family default +\series default + also +\family typewriter +#define NO_BIT_DEFINES +\family default + in order to access SFRs as +\family typewriter +<sfrname>bits.<bitname> +\family default +, otherwise +\family typewriter +<bitname> +\family default + will expand to +\family typewriter +<sfrname>bits.<bitname> +\family default +, yielding the undefined expression +\family typewriter +<sfrname>bits.<sfrname>bits.<bitname> +\family default +. +\end_layout + +\begin_layout Subsubsection +error: missing definition for symbol ``__gptrget1'' +\end_layout + +\begin_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)! +\end_layout + +\begin_layout Subsubsection +Processor mismatch in file ``XXX''. +\end_layout + +\begin_layout Standard +This warning can usually be ignored due to the very good compatibility amongst + 14 +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +, +\end_layout + +\end_inset + +bit PIC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC14 +\end_layout + +\end_inset + + devices. +\end_layout + +\begin_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 unnecessary + BANKSELs might be removed. +\end_layout + +\begin_layout Subsection +Known Bugs +\end_layout + +\begin_layout Subsubsection +Function arguments +\end_layout + +\begin_layout Standard +Functions with variable argument lists (like printf) are not yet supported. + Similarly, taking the address of the first argument passed into a function + does not work: It is currently passed in WREG and has no address... +\end_layout + +\begin_layout Subsubsection +Regression tests fail +\end_layout + +\begin_layout Standard +Though the small subset of regression tests in src/regression passes, SDCC + regression test suite does not, indicating that there are still major bugs + in the port. + However, many smaller projects have successfully used SDCC in the past... +\end_layout + +\begin_layout Section +The PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port +\end_layout + +\begin_layout Standard +The PIC16 port adds support for Microchip +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Microchip +\end_layout + +\end_inset + + +\begin_inset Formula $^{\text{TM}}$ +\end_inset + + PIC +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC +\end_layout + +\end_inset + + +\begin_inset Formula $^{\text{TM}}$ +\end_inset + + MCUs with 16 bit wide instructions. + This port is not yet mature and still lacks many features. + However, it can work for simple code. + Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx +; devices supported by the port include: +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +18F13K22 18F13K50 +\end_layout + +\begin_layout Standard +18F14K22 18F14K50 +\end_layout + +\begin_layout Standard +18F23K20 18F23K22 +\end_layout + +\begin_layout Standard +18F24J10 18F24J11 18F24J50 18F24K20 18F24K22 18F24K50 +\end_layout + +\begin_layout Standard +18F25J10 18F25J11 18F25J50 18F25K20 18F25K22 18F25K50 18F25K80 +\end_layout + +\begin_layout Standard +18F26J11 18F26J13 18F26J50 18F26J53 18F26K20 18F26K22 18F26K80 +\end_layout + +\begin_layout Standard +18F27J13 18F27J53 +\end_layout + +\begin_layout Standard +18F43K20 18F43K22 +\end_layout + +\begin_layout Standard +18F44J10 18F44J11 18F44J50 18F44K20 18F44K22 +\end_layout + +\begin_layout Standard +18F45J10 18F45J11 18F45J50 18F45K20 18F45K22 18F45K50 18F45K80 +\end_layout + +\begin_layout Standard +18F46J11 18F46J13 18F46J50 18F46J53 18F46K20 18F46K22 18F46K80 +\end_layout + +\begin_layout Standard +18F47J13 18F47J53 +\end_layout + +\begin_layout Standard +18F63J11 18F63J90 +\end_layout + +\begin_layout Standard +18F64J11 18F64J90 +\end_layout + +\begin_layout Standard +18F65J10 18F65J11 18F65J15 18F65J50 18F65J90 18F65J94 18F65K22 18F65K80 + 18F65K90 +\end_layout + +\begin_layout Standard +18F66J10 18F66J11 18F66J15 18F66J16 18F66J50 18F66J55 18F66J60 18F66J65 +\end_layout + +\begin_layout Standard +18F66J90 18F66J93 18F66J94 18F66J99 18F66K22 18F66K80 18F66K90 +\end_layout + +\begin_layout Standard +18F67J10 18F67J11 18F67J50 18F67J60 18F67J90 18F67J93 18F67J94 18F67K22 + 18F67K90 +\end_layout + +\begin_layout Standard +18F83J11 18F83J90 +\end_layout + +\begin_layout Standard +18F84J11 18F84J90 +\end_layout + +\begin_layout Standard +18F85J10 18F85J11 18F85J15 18F85J50 18F85J90 18F85J94 18F85K22 18F85K90 +\end_layout + +\begin_layout Standard +18F86J10 18F86J11 18F86J15 18F86J16 18F86J50 18F86J55 18F86J60 18F86J65 +\end_layout + +\begin_layout Standard +18F86J72 18F86J90 18F86J93 18F86J94 18F86J99 18F86K22 18F86K90 +\end_layout + +\begin_layout Standard +18F87J10 18F87J11 18F87J50 18F87J60 18F87J72 18F87J90 18F87J93 18F87J94 + 18F87K22 18F87K90 +\end_layout + +\begin_layout Standard +18F95J94 18F96J60 18F96J65 18F96J94 18F96J99 +\end_layout + +\begin_layout Standard +18F97J60 18F97J94 +\end_layout + +\begin_layout Standard +18F242 18F248 18F252 18F258 +\end_layout + +\begin_layout Standard +18F442 18F448 18F452 18F458 +\end_layout + +\begin_layout Standard +18F1220 18F1230 +\end_layout + +\begin_layout Standard +18F1320 18F1330 +\end_layout + +\begin_layout Standard +18F2220 18F2221 +\end_layout + +\begin_layout Standard +18F2320 18F2321 18F2331 +\end_layout + +\begin_layout Standard +18F2410 18F2420 18F2423 18F2431 18F2439 18F2450 18F2455 18F2458 18F2480 +\end_layout + +\begin_layout Standard +18F2510 18F2515 18F2520 18F2523 18F2525 18F2539 18F2550 18F2553 18F2580 + 18F2585 +\end_layout + +\begin_layout Standard +18F2610 18F2620 18F2680 18F2682 18F2685 +\end_layout + +\begin_layout Standard +18F4220 18F4221 +\end_layout + +\begin_layout Standard +18F4320 18F4321 18F4331 +\end_layout + +\begin_layout Standard +18F4410 18F4420 18F4423 18F4431 18F4439 18F4450 18F4455 18F4458 18F4480 +\end_layout + +\begin_layout Standard +18F4510 18F4515 18F4520 18F4523 18F4525 18F4539 18F4550 18F4553 18F4580 + 18F4585 +\end_layout + +\begin_layout Standard +18F4610 18F4620 18F4680 18F4682 18F4685 +\end_layout + +\begin_layout Standard +18F6310 18F6390 18F6393 +\end_layout + +\begin_layout Standard +18F6410 18F6490 18F6493 +\end_layout + +\begin_layout Standard +18F6520 18F6525 18F6527 18F6585 +\end_layout + +\begin_layout Standard +18F6620 18F6621 18F6622 18F6627 18F6628 18F6680 +\end_layout + +\begin_layout Standard +18F6720 18F6722 18F6723 +\end_layout + +\begin_layout Standard +18F8310 18F8390 18F8393 +\end_layout + +\begin_layout Standard +18F8410 18F8490 18F8493 +\end_layout + +\begin_layout Standard +18F8520 18F8525 18F8527 18F8585 +\end_layout + +\begin_layout Standard +18F8620 18F8621 18F8622 18F8627 18F8628 18F8680 +\end_layout + +\begin_layout Standard +18F8720 18F8722 18F8723 +\end_layout + +\begin_layout Standard +18LF13K22 18LF13K50 +\end_layout + +\begin_layout Standard +18LF14K22 18LF14K50 +\end_layout + +\begin_layout Standard +18LF23K22 18LF24J10 18LF24J11 18LF24J50 18LF24K22 18LF24K50 +\end_layout + +\begin_layout Standard +18LF25J10 18LF25J11 18LF25J50 18LF25K22 18LF25K50 18LF25K80 +\end_layout + +\begin_layout Standard +18LF26J11 18LF26J13 18LF26J50 18LF26J53 18LF26K22 18LF26K80 +\end_layout + +\begin_layout Standard +18LF27J13 18LF27J53 +\end_layout + +\begin_layout Standard +18LF43K22 +\end_layout + +\begin_layout Standard +18LF44J10 18LF44J11 18LF44J50 18LF44K22 +\end_layout + +\begin_layout Standard +18LF45J10 18LF45J11 18LF45J50 18LF45K22 18LF45K50 18LF45K80 +\end_layout + +\begin_layout Standard +18LF46J11 18LF46J13 18LF46J50 18LF46J53 18LF46K22 18LF46K80 +\end_layout + +\begin_layout Standard +18LF47J13 18LF47J53 +\end_layout + +\begin_layout Standard +18LF65K80 +\end_layout + +\begin_layout Standard +18LF66K80 +\end_layout + +\begin_layout Standard +18LF242 18LF248 18LF252 18LF258 +\end_layout + +\begin_layout Standard +18LF442 18LF448 18LF452 18LF458 +\end_layout + +\begin_layout Standard +18LF1220 18LF1230 +\end_layout + +\begin_layout Standard +18LF1320 18LF1330 +\end_layout + +\begin_layout Standard +18LF2220 18LF2221 +\end_layout + +\begin_layout Standard +18LF2320 18LF2321 18LF2331 +\end_layout + +\begin_layout Standard +18LF2410 18LF2420 18LF2423 18LF2431 18LF2439 18LF2450 18LF2455 18LF2458 + 18LF2480 +\end_layout + +\begin_layout Standard +18LF2510 18LF2515 18LF2520 18LF2523 18LF2525 18LF2539 18LF2550 18LF2553 + 18LF2580 18LF2585 +\end_layout + +\begin_layout Standard +18LF2610 18LF2620 18LF2680 18LF2682 18LF2685 +\end_layout + +\begin_layout Standard +18LF4220 18LF4221 +\end_layout + +\begin_layout Standard +18LF4320 18LF4321 18LF4331 +\end_layout + +\begin_layout Standard +18LF4410 18LF4420 18LF4423 18LF4431 18LF4439 18LF4450 18LF4455 18LF4458 + 18LF4480 +\end_layout + +\begin_layout Standard +18LF4510 18LF4515 18LF4520 18LF4523 18LF4525 18LF4539 18LF4550 18LF4553 + 18LF4580 18LF4585 +\end_layout + +\begin_layout Standard +18LF4610 18LF4620 18LF4680 18LF4682 18LF4685 +\end_layout + +\begin_layout Standard +18LF6310 18LF6390 18LF6393 +\end_layout + +\begin_layout Standard +18LF6410 18LF6490 18LF6493 +\end_layout + +\begin_layout Standard +18LF6520 18LF6525 18LF6527 18LF6585 +\end_layout + +\begin_layout Standard +18LF6620 18LF6621 18LF6622 18LF6627 18LF6628 18LF6680 +\end_layout + +\begin_layout Standard +18LF6720 18LF6722 18LF6723 +\end_layout + +\begin_layout Standard +18LF8310 18LF8390 18LF8393 +\end_layout + +\begin_layout Standard +18LF8410 18LF8490 18LF8493 +\end_layout + +\begin_layout Standard +18LF8520 18LF8525 18LF8527 18LF8585 +\end_layout + +\begin_layout Standard +18LF8620 18LF8621 18LF8622 18LF8627 18LF8628 18LF8680 +\end_layout + +\begin_layout Standard +18LF8720 18LF8722 18LF8723 +\end_layout + +\begin_layout Standard +\begin_inset VSpace defskip +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +An up-to-date list of supported devices is also available via ' +\family typewriter +sdcc -mpic16 -plist +\family default +'. +\end_layout + +\begin_layout Subsection +Global Options +\end_layout + +\begin_layout Standard +PIC16 port supports the standard command line arguments as supposed, with + the exception of certain cases that will be mentioned in the following + list: +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-callee-saves +\end_layout + +\end_inset + + See - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-all-callee-saves +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Options!- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + Make non-free device headers and libraries available in the compiler's + search paths (implicit -I and -L options). +\end_layout + +\begin_layout Subsection +Port Specific Options +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Options PIC16 +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The port specific options appear after the global options in the sdcc - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-help output. +\end_layout + +\begin_layout Subsubsection +Code Generation Options +\end_layout + +\begin_layout Standard +These options influence the generated assembler code. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pstack-model=[model] Used in conjunction with the command above. + Defines the stack model to be used, valid stack models are: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\emph on +small +\emph default + Selects small stack model. + 8 bit stack and frame pointers. + Supports 256 bytes stack size. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\emph on +large +\emph default + Selects large stack model. + 16 bit stack and frame pointers. + Supports 65536 bytes stack size. +\end_layout + +\end_deeper +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pno-banksel Do not generate BANKSEL assembler directives. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-extended Enable extended instruction set/literal offset addressing mode. + Use with care! +\end_layout + +\begin_layout Subsubsection +Optimization Options +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-obanksel=n Set optimization level for inserting BANKSELs. +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Labeling +\labelwidthstring 00.00.0000 +0 no optimization +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +1 checks previous used register and if it is the same then does not emit + BANKSEL, accounts only for labels. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +2 tries to check the location of (even different) symbols and removes BANKSELs + if they are in the same bank. + +\begin_inset Newline newline +\end_inset + + +\emph on +Important: There might be problems if the linker script has data sections + across bank borders! +\end_layout + +\end_deeper +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-denable-peeps Force the usage of peepholes. + Use with care. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-optimize-goto Do not use (conditional) BRA instead of GOTO. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-optimize-cmp Try to optimize some compares. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-optimize-df Analyze the dataflow of the generated code and improve it. +\end_layout + +\begin_layout Subsubsection +Assembling Options +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-asm= Sets the full path and name of an external assembler to call. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-mplab-comp MPLAB +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!MPLAB +\end_layout + +\end_inset + + compatibility option. + Currently only suppresses special gpasm directives. +\end_layout + +\begin_layout Subsubsection +Linking Options +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-link= Sets the full path and name of an external linker to call. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-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". +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-ivt-loc=n Place the interrupt vector table at address +\emph on +n +\emph default +. + Useful for bootloaders. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-nodefaultlibs Do not link default libraries when linking. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-crt= Use a custom run-time module instead of the default (crt0i). +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-no-crt Don't link the default run-time modules +\end_layout + +\begin_layout Subsubsection +Debugging Options +\end_layout + +\begin_layout Standard +Debugging options enable extra debugging information in the output files. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug-xtra Similar to - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\end_layout + +\end_inset + +, but dumps more information. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug-ralloc Force register allocator to dump <source>.d file with debugging + information. + <source> is the name of the file being compiled. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-pcode-verbose Enable pcode debugging information in translation. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-calltree Dump call tree in .calltree file. +\end_layout + +\begin_layout Description +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-gstack Trace push/pops for stack pointer overflow. +\end_layout + +\begin_layout Subsection +Environment Variables +\end_layout + +\begin_layout Standard +There is a number of environmental 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. +\end_layout + +\begin_layout Standard +Currently there is only two such variables available: +\end_layout + +\begin_layout Description +OPTIMIZE_BITFIELD_POINTER_GET +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Environment variables!OPTIMIZE +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +BITFIELD +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +POINTER +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +GET +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!OPTIMIZE +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +BITFIELD +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +POINTER +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +GET (PIC16) +\end_layout + +\end_inset + + When this variable exists, reading of structure bit-fields is optimized + by directly loading FSR0 with the address of the bit-field structure. + Normally SDCC will cast the bit-field structure to a bit-field pointer + and then load FSR0. + This step saves data ram and code space for functions that make heavy use + of bit-fields. + (i.e., 80 bytes of code space are saved when compiling malloc.c with this + option). + +\end_layout + +\begin_layout Description +NO_REG_OPT +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Environment variables!NO +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +REG +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +OPT +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Environment variables!NO +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +REG +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +OPT +\end_layout + +\end_inset + + Do not perform pCode registers optimization. + This should be used for debugging purposes. + If bugs in the pcode optimizer are found, users can benefit from temporarily + disabling the optimizer until the bug is fixed. +\end_layout + +\begin_layout Subsection +Preprocessor Macros +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Preprocessor!PIC16 Macros +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port defines the following preprocessor macros while translating a source. +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="5" columns="2"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Macro +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_pic16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC!Defines!__SDCC +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pic16 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Port identification +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pic18fxxxx +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Defines!pic18fxxxx +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +MCU Identification. + +\emph on +xxxx +\emph default + is the microcontrol identification number, i.e. + 452, 6620, etc +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +_ +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +_18Fxxxx +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Defines! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +pic18fxxxx +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +MCU Identification (same as above) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +STACK_MODEL_nnn +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Defines!STACK +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +MODEL +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +nnn +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +nnn = SMALL or LARGE respectively according to the stack model used +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +In addition the following macros are defined when calling assembler: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="4" columns="2"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Macro +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__18Fxxxx +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +MCU Identification. + +\emph on +xxxx +\emph default + is the microcontrol identification number, i.e. + 452, 6620, etc +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +__SDCC_MODEL_nnn +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +nnn = SMALL or LARGE respectively according to the memory model used for + SDCC +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +STACK_MODEL_nnn +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +nnn = SMALL or LARGE respectively according to the stack model used +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsection +Directories +\end_layout + +\begin_layout Standard +PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port uses the following directories for searching header files and libraries. +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="4"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Directory +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Target +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Command prefix +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PREFIX/sdcc/include/pic16 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PIC16 specific headers +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Compiler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-I +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PREFIX/sdcc/lib/pic16 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PIC16 specific libraries +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-L +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +If the +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + +\series default + command line option is specified, non-free directories are searched: +\begin_inset Newline newline +\end_inset + + +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="4"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Directory +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Target +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Command prefix +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PREFIX/sdcc/non-free/include/pic16 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PIC16 specific non-free headers +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Compiler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-I +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PREFIX/sdcc/non-free/lib/pic16 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PIC16 specific non-free libraries +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +-L +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsection +Pragmas +\begin_inset CommandInset label +LatexCommand label +name "subsec:PIC16_Pragmas" + +\end_inset + + +\end_layout + +\begin_layout Standard +The PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port currently supports the following pragmas: +\end_layout + +\begin_layout Description +stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Pragmas! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma stack +\end_layout + +\end_inset + + This forces the code generator to initialize the stack & frame pointers + at a specific address. + This is an ad hoc solution for cases where no STACK directive is available + in the linker script or gplink is not instructed to create a stack section. +\begin_inset Newline newline +\end_inset + +The stack pragma should be used only once in a project. + Multiple pragmas may result in indeterminate behaviour of the program. +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +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_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + +The format is as follows: +\end_layout + +\begin_layout LyX-Code +#pragma stack bottom_address [stack_size] +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard + +\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). +\end_layout + +\begin_layout LyX-Code +Example: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +/* initializes stack of 100 bytes at RAM address 0x200 */ +\end_layout + +\begin_layout LyX-Code +#pragma stack 0x200 100 +\end_layout + +\begin_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. +\end_layout + +\begin_layout Description +code +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Pragmas! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma code +\end_layout + +\end_inset + + Force a function to a static FLASH address. +\end_layout + +\begin_layout LyX-Code +Example: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +/* place function test_func at 0x4000 */ +\end_layout + +\begin_layout LyX-Code +#pragma code test_func 0x4000 +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Description +library +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Pragmas! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma library +\end_layout + +\end_inset + + instructs the linker to use a library module. +\begin_inset Newline newline +\end_inset + +Usage: +\end_layout + +\begin_layout LyX-Code +#pragma library module_name +\end_layout + +\begin_layout Standard + +\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: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="6" columns="3"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="block" valignment="top" width="20page%"> +<column alignment="left" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Keyword +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Module to link +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +ignore +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +ignore all library pragmas +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +(none) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +link the C library +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +libc18f +\emph default +.lib +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +math +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +link the Math libarary +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +libm18f +\emph default +.lib +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +io +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +link the I/O library +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +libio18f* +\emph default +.lib +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +debug +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +link the debug library +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +libdebug +\emph default +.lib +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\begin_inset Newline newline +\end_inset + +* is the device number, i.e. + 452 for PIC18F452 MCU. +\end_layout + +\begin_layout Standard +\noindent +This feature allows for linking with specific libraries without 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. +\end_layout + +\begin_layout Description +udata +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Pragmas! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma udata +\end_layout + +\end_inset + + The pragma udata instructs the compiler to emit code so that linker will + place a variable at a specific memory bank. +\end_layout + +\begin_layout LyX-Code +Example: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +/* places variable foo at bank2 */ +\end_layout + +\begin_layout LyX-Code +#pragma udata bank2 foo +\end_layout + +\begin_layout LyX-Code +char foo; +\end_layout + +\begin_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: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +// Sample linker script for the PIC18F452 processor +\end_layout + +\begin_layout LyX-Code +LIBPATH . +\end_layout + +\begin_layout LyX-Code +CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED +\end_layout + +\begin_layout LyX-Code +CODEPAGE NAME=page START=0x2A END=0x7FFF +\end_layout + +\begin_layout LyX-Code +CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED +\end_layout + +\begin_layout LyX-Code +CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED +\end_layout + +\begin_layout LyX-Code +CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED +\end_layout + +\begin_layout LyX-Code +CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED +\end_layout + +\begin_layout LyX-Code +ACCESSBANK NAME=accessram START=0x0 END=0x7F +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +DATABANK NAME=gpr0 START=0x80 END=0xFF +\end_layout + +\begin_layout LyX-Code +DATABANK NAME=gpr1 START=0x100 END=0x1FF +\end_layout + +\begin_layout LyX-Code +DATABANK NAME=gpr2 START=0x200 END=0x2FF +\end_layout + +\begin_layout LyX-Code +DATABANK NAME=gpr3 START=0x300 END=0x3FF +\end_layout + +\begin_layout LyX-Code +DATABANK NAME=gpr4 START=0x400 END=0x4FF +\end_layout + +\begin_layout LyX-Code +DATABANK NAME=gpr5 START=0x500 END=0x5FF +\end_layout + +\begin_layout LyX-Code +ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +SECTION NAME=CONFIG ROM=config +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +SECTION NAME=bank0 RAM=gpr0 # these SECTION directives +\end_layout + +\begin_layout LyX-Code +SECTION NAME=bank1 RAM=gpr1 # should be added to link +\end_layout + +\begin_layout LyX-Code +SECTION NAME=bank2 RAM=gpr2 # section name 'bank?' with +\end_layout + +\begin_layout LyX-Code +SECTION NAME=bank3 RAM=gpr3 # a specific DATABANK name +\end_layout + +\begin_layout LyX-Code +SECTION NAME=bank4 RAM=gpr4 +\end_layout + +\begin_layout LyX-Code +SECTION NAME=bank5 RAM=gpr5 +\end_layout + +\begin_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. +\end_layout + +\begin_layout Description +config +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Pragmas! +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma config +\end_layout + +\end_inset + + The pragma config instructs the compiler to emit config directive. +\begin_inset Newline newline +\end_inset + +The format is as follows: +\end_layout + +\begin_layout LyX-Code +#pragma config setting=value [, setting=value] +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Standard +Multiple settings may be defined on a single line, separated by commas. + Settings for a single configuration byte may also be defined on separate + lines. + +\end_layout + +\begin_layout LyX-Code +Example: +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +#pragma config CP0=OFF,OSCS=ON,OSC=LP,BOR=ON,BORV=25,WDT=ON,WDTPS=128,CCP2MUX=ON +\end_layout + +\begin_layout LyX-Code +#pragma config STVR=ON +\end_layout + +\begin_layout Subsection +Header Files and Libraries +\begin_inset CommandInset label +LatexCommand label +name "subsec:PIC16_Header-Files-and-Libraries" + +\end_inset + + +\end_layout + +\begin_layout Standard +Pic device specific header and c source files are automatically generated + from MPLAB include files, which are published by Microchip with a special + requirement that they are only to be used with authentic Microchip devices. + This requirement prevents to publish generated header and c source files + under the GPL compatible license, so they are located in the non-free directory + (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Search-Paths" + +\end_inset + +). + In order to include them in include and library search paths, the +\series bold +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-use-non-free +\end_layout + +\end_inset + + +\series default + command line option should be defined. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +NOTE: the compiled code, which use non-free pic device specific libraries, + is not GPL compatible! +\end_layout + +\begin_layout Subsection +Header Files +\begin_inset CommandInset label +LatexCommand label +name "subsec:PIC16_Header-Files" + +\end_inset + + +\end_layout + +\begin_layout Standard +There is one main header file +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Header files +\end_layout + +\end_inset + + that can be included to the source files using the pic16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + 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: +\end_layout + +\begin_layout LyX-Code +#include <pic18fregs.h> +\end_layout + +\begin_layout Standard +The specific microcontroller is selected within the pic18fregs.h automatically, + so the same source can be used with a variety of devices. +\end_layout + +\begin_layout Subsection +Libraries +\begin_inset CommandInset label +LatexCommand label +name "subsec:pic16Libraries" + +\end_inset + + +\end_layout + +\begin_layout Standard +The libraries +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!Libraries +\end_layout + +\end_inset + + that PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\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. +\end_layout + +\begin_layout Standard +\noindent +Libraries are created with gplib which is part of the gputils package +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/gputils +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Subsubsection* +Building the libraries +\end_layout + +\begin_layout Standard +Before using SDCC/pic16 there are some libraries that need to be compiled. + This process is done automatically if gputils are found at SDCC's compile + time. + Should you require to rebuild the pic16 libraries manually (e.g. + in order to enable output of float values +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!PIC16 Floating point support +\end_layout + +\end_inset + + via +\family typewriter +printf() +\family default +, see below), these are the steps required to do so under Linux or Mac OS + X (cygwin might work as well, but is untested): +\end_layout + +\begin_layout LyX-Code +cd device/lib/pic16 +\end_layout + +\begin_layout LyX-Code +./configure.gnu +\end_layout + +\begin_layout LyX-Code +cd .. +\end_layout + +\begin_layout LyX-Code +make model-pic16 +\end_layout + +\begin_layout LyX-Code +su -c 'make install' # install the libraries, you need the root password +\end_layout + +\begin_layout LyX-Code +cd ../.. +\end_layout + +\begin_layout Standard +If you need to install the headers too, do: +\end_layout + +\begin_layout LyX-Code +cd device/include +\end_layout + +\begin_layout LyX-Code +su -c 'make install' # install the headers, you need the root password +\end_layout + +\begin_layout Subsubsection* +Output of float values via printf() +\end_layout + +\begin_layout Standard +The library is normally built without support for displaying float values, + only <NO FLOAT> +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<NO FLOAT> +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!PIC16 floating point support +\end_layout + +\end_inset + + will appear instead of the value. + To change this, rebuild the library as stated above, but call +\family typewriter +./configure.gnu --enable-floats +\family default +instead of just +\family typewriter +./configure.gnu +\family default +. + Also make sure that at least +\family typewriter +libc/stdio/vfprintf.c +\family default + is actually recompiled, e.g. + by +\family typewriter +touch +\family default +ing it after the +\family typewriter +configure +\family default + run or deleting its +\family typewriter +.o +\family default + file. +\end_layout + +\begin_layout Standard +The more common approach of compiling +\family typewriter +vfprintf.c +\family default + manually with +\family typewriter +-DUSE_FLOATS=1 +\family default + should also work, but is untested. +\end_layout + +\begin_layout Subsection +Adding New Devices to the Port +\end_layout + +\begin_layout Standard +Adding support for a new 16 +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +, +\end_layout + +\end_inset + +bit PIC MCU requires the following steps: +\end_layout + +\begin_layout Enumerate +Create picDEVICE.c and picDEVICE.h from pDEVICE.inc using +\begin_inset Newline newline +\end_inset + + +\family typewriter +perl /path/to/sdcc/support/scripts/inc2h-pic16.pl +\backslash + +\begin_inset Newline newline +\end_inset + +/path/to/gputils/header/pDEVICE.inc +\end_layout + +\begin_layout Enumerate + +\family typewriter +mv picDEVICE.h /path/to/sdcc/device/non-free/include/pic16 +\end_layout + +\begin_layout Enumerate + +\family typewriter +mv picDEVICE.c /path/to/sdcc/device/non-free/lib/pic16/libdev +\end_layout + +\begin_layout Enumerate +Either +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Enumerate +add the new device to +\family typewriter +/path/to/sdcc/device/lib/pic16/libio/*.ignore +\family default + to suppress building any of the I/O libraries for the new device +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +In fact, the +\family typewriter +.ignore +\family default + files are only used when auto-generating +\family typewriter +Makefile.am +\family default + using the +\family typewriter +.../libio/mkmk.sh +\family default + script. +\end_layout + +\end_inset + +, or +\end_layout + +\begin_layout Enumerate +add the device (family) to +\family typewriter +/path/to/sdcc/support/scripts/pic18fam-h-gen.pl +\family default + to assign I/O styles, run the +\family typewriter +pic18fam-h-gen.pl +\family default + script to generate +\family typewriter +pic18fam.h.gen +\family default +, replace your existing +\family typewriter +pic18fam.h +\family default + with the generated file, and (if required) implement new I/O styles in + +\family typewriter +/path/to/sdcc/device/include/pic16/{adc,i2c,usart}.h +\family default + and +\family typewriter +/path/to/sdcc/device/lib/pic16/libio/*/*. +\end_layout + +\end_deeper +\begin_layout Enumerate +Edit +\family typewriter +/path/to/sdcc/device/include/pic16/pic18fregs.h +\family default + +\begin_inset Newline newline +\end_inset + +The file format is self-explanatory, just add +\begin_inset Newline newline +\end_inset + + +\family typewriter +#elif defined(picDEVICE) +\begin_inset Newline newline +\end_inset + +# +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash + +\backslash + +\end_layout + +\end_inset + +include <picDEVICE.h> +\family default + +\begin_inset Newline newline +\end_inset + +at the right place (keep the file sorted, please). +\end_layout + +\begin_layout Enumerate +Edit +\family typewriter +/path/to/sdcc/device/include/pic16devices.txt +\begin_inset Newline newline +\end_inset + + +\family default +Copy and modify an existing entry or create a new one and insert it at the + correct place (keep the file sorted, please). +\end_layout + +\begin_layout Enumerate + +\family typewriter +( cd /path/to/sdcc/device/non-free/lib/pic16 && sh update.sh ) +\end_layout + +\begin_layout Enumerate +Recompile the pic16 libraries as described in +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:pic16Libraries" + +\end_inset + + or just configure and build sdcc again from scratch (recommended). +\end_layout + +\begin_layout Subsection +Memory Models +\end_layout + +\begin_layout Standard +The following memory models are supported by the PIC16 port: +\end_layout + +\begin_layout Itemize +small model +\end_layout + +\begin_layout Itemize +large model +\end_layout + +\begin_layout Standard +Memory model affects the default size of pointers within the source. + The sizes are shown in the next table: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="3"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Pointer sizes according to memory model +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +small model +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +large model +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +code pointers +\end_layout + +\end_inset +</cell> +<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16-bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +24-bits +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +data pointers +\end_layout + +\end_inset +</cell> +<cell multicolumn="1" alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16-bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16-bits +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_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. +\end_layout + +\begin_layout Standard +The standard device libraries (see +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:PIC16_Header-Files" + +\end_inset + +) contain no reference to pointers, so they can be used with both memory + models. +\end_layout + +\begin_layout Subsection +Stack +\end_layout + +\begin_layout Standard +The stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!stack +\end_layout + +\end_inset + + implementation for the PIC16 port uses two indirect registers, FSR1 and + FSR2. +\end_layout + +\begin_layout Description +FSR1 is assigned as stack pointer +\end_layout + +\begin_layout Description +FSR2 is assigned as frame pointer +\end_layout + +\begin_layout Standard +The following stack models are supported by the PIC16 port +\end_layout + +\begin_layout Itemize + +\noun on +small +\noun default + model +\end_layout + +\begin_layout Itemize + +\noun on +large +\noun default + model +\end_layout + +\begin_layout Standard + +\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: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="3" columns="3"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Stack & Frame pointer sizes according to stack model +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +small +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +large +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Stack pointer FSR1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8-bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16-bits +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Frame pointer FSR2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8-bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16-bits +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent + +\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: +\end_layout + +\begin_layout Enumerate +Do not create stack sections with size more than one physical bank (that + is 256 bytes) +\end_layout + +\begin_layout Enumerate +Stack sections should no cross physical bank limits (i.e. + #pragma stack 0x50 0x100) +\end_layout + +\begin_layout Standard +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. +\end_layout + +\begin_layout Subsection +Functions +\end_layout + +\begin_layout Standard +In addition to the standard SDCC function keywords, PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port makes available two more: +\end_layout + +\begin_layout Description +__wparam +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!wparam +\end_layout + +\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: +\end_layout + +\begin_layout LyX-Code +void func_wparam(int a) __wparam +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code + /* WREG hold the lower part of a */ +\end_layout + +\begin_layout LyX-Code + /* the high part of a is stored in FSR2+2 (or +3 for large stack model) + */ +\end_layout + +\begin_layout LyX-Code +... +\end_layout + +\begin_layout LyX-Code +} +\end_layout + +\begin_layout Description +__shadowregs +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!shadowregs +\end_layout + +\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. +\end_layout + +\begin_layout LyX-Code +void isr_shadow(void) __shadowregs __interrupt 1 +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code +... +\end_layout + +\begin_layout LyX-Code +} +\end_layout + +\begin_layout Standard + +\emph on +__shadowregs +\emph default + instructs the code generator not to store/restore WREG, STATUS, BSR when + entering/exiting the ISR. +\end_layout + +\begin_layout Subsection +Function return values +\end_layout + +\begin_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: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="6" columns="2"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +size +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +destination register +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8 bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +WREG +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +16 bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PRODL:WREG +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +24 bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PRODH:PRODL:WREG +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +32 bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +FSR0L:PRODH:PRODL:WREG +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +>32 bits +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +on stack, FSR0 points to the beginning +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Subsection +Interrupts +\end_layout + +\begin_layout Standard +An interrupt +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!interrupt +\end_layout + +\end_inset + + service routine (ISR) is declared using the +\emph on +__interrupt +\emph default + keyword. +\end_layout + +\begin_layout LyX-Code +void isr(void) __interrupt +\emph on +n +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code +... +\end_layout + +\begin_layout LyX-Code +} +\end_layout + +\begin_layout Standard + +\emph on +n +\emph default + is the interrupt number, which for PIC18F devices can be: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="4" columns="3"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\emph on +n +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt Vector +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Interrupt Vector Address +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +RESET vector +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x000000 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +HIGH priority interrupts +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x000008 +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +LOW priority interrupts +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0x000018 +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_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 generated ISR. + This single GOTO instruction is part of an automatically generated +\emph on +interrupt entry point +\emph default + function. + The actual 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 indeterminate program + behaviour if that interrupt is raised. +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +This is not a problem when +\end_layout + +\begin_layout Enumerate +this is a HIGH interrupt ISR and LOW interrupts are +\emph on +disabled +\emph default + or not used. +\end_layout + +\begin_layout Enumerate +when the ISR is small enough not to reach the next interrupt's vector address. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard + +\emph on +n +\emph default + may be omitted. + This way a function is generated similar to an ISR, but it is not assigned + to any interrupt. +\end_layout + +\begin_layout Standard +When entering an interrupt, currently the PIC16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port automatically saves the following registers: +\end_layout + +\begin_layout Itemize +WREG +\end_layout + +\begin_layout Itemize +STATUS +\end_layout + +\begin_layout Itemize +BSR +\end_layout + +\begin_layout Itemize +PROD (PRODL and PRODH) +\end_layout + +\begin_layout Itemize +FSR0 (FSR0L and FSR0H) +\end_layout + +\begin_layout Standard +These registers are restored upon return from the interrupt routine. +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +NOTE that when the _naked attribute is specified for an interrupt routine, + then NO registers are stored or restored. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Generic Pointers +\end_layout + +\begin_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: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="5" columns="5"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="left" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pointer type +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +7th bit +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +6th bit +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +rest of the pointer +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +data +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +\shape slanted +\emph on +uuuuuu uuuuxxxx xxxxxxxx +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +a 12-bit data pointer in data RAM memory +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +code +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +\shape slanted +\emph on +uxxxxx xxxxxxxx xxxxxxxx +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +a 21-bit code pointer in FLASH memory +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +eeprom +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +\shape slanted +\emph on +uuuuuu uuuuuuxx xxxxxxxx +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +a 10-bit eeprom pointer in EEPROM memory +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +(unimplemented) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +\shape slanted +\emph on +xxxxxx xxxxxxxx xxxxxxxx +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +unimplemented pointer type +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +Generic pointer are read and written with a set of library functions which + read/write 1, 2, 3, 4 bytes. +\end_layout + +\begin_layout Subsection +Configuration Bits +\end_layout + +\begin_layout Standard +Configuration bits (also known as fuses) can be configured using one of + two methods: +\end_layout + +\begin_layout Itemize +using #pragma config (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:PIC16_Pragmas" + +\end_inset + +), which is a preferred method for the new code. + Example: +\end_layout + +\begin_layout LyX-Code +#pragma config CP0=OFF,OSCS=ON,OSC=LP,BOR=ON,BORV=25,WDT=ON,WDTPS=128,CCP2MUX=ON +\end_layout + +\begin_layout LyX-Code +#pragma config STVR=ON +\end_layout + +\begin_layout Itemize +using ` +\family typewriter +__code +\family default +' and ` +\family typewriter +__at +\family default +' modifiers. + This method is deprecated. + Possible options should be ANDed and can be found in your processor header + file. + Example for PIC18F2550: +\end_layout + +\begin_layout LyX-Code + +\family typewriter +#include <pic18fregs.h> //Contains config addresses and options +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +static __code char __at(__CONFIG1L) configword1l = +\begin_inset Newline newline +\end_inset + + _USBPLL_CLOCK_SRC_FROM_96MHZ_PLL_2_1L & +\end_layout + +\begin_layout LyX-Code + +\family typewriter + _PLLDIV_NO_DIVIDE__4MHZ_INPUT__1L & [...]; +\begin_inset Newline newline +\end_inset + +static __code char __at(__CONFIG1H) configword1h = [...]; +\begin_inset Newline newline +\end_inset + +static __code char __at(__CONFIG2L) configword2l = [...]; +\begin_inset Newline newline +\end_inset + +//More configuration words +\end_layout + +\begin_layout Standard +Mixing both methods is not allowed and throws an error message +\begin_inset Quotes sld +\end_inset + +mixing __CONFIG and CONFIG directives +\begin_inset Quotes srd +\end_inset + +. +\end_layout + +\begin_layout Subsection +PIC16 C Libraries +\end_layout + +\begin_layout Subsubsection +Standard I/O Streams +\end_layout + +\begin_layout Standard +In the +\emph on +stdio.h +\emph default + the type FILE is defined as: +\end_layout + +\begin_layout LyX-Code +typedef char * FILE; +\end_layout + +\begin_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: +\end_layout + +\begin_layout LyX-Code +extern FILE * stdin; +\end_layout + +\begin_layout LyX-Code +extern FILE * stdout; +\end_layout + +\begin_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: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="2" columns="7"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="left" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pointer type +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +<7:6> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +<5> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +<4> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +<3:0> +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +rest of the pointer +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +descrption +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +stream +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +00 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +nnnn +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +\shape slanted +\emph on +uuuuuuuu uuuuuuuu +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +upper byte high nubble is 0x2n, the rest are zeroes +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +Currently implemented there are 3 types of streams defined: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="4" columns="4"> +<features tabularvalignment="middle"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +stream type +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +value +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +module +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +STREAM_USART +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +0x200000UL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +USART +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Writes/Reads characters via the USART peripheral +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +STREAM_MSSP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +0x210000UL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +MSSP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Writes/Reads characters via the MSSP peripheral +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +STREAM_USER +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family typewriter +0x2f0000UL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +(none) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Writes/Reads characters via used defined functions +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +The stream identifiers are declared as macros in the stdio.h header. +\end_layout + +\begin_layout Standard +\noindent +In the libc library there exist the functions that are used to write to + each of the above streams. + These are +\end_layout + +\begin_layout Description +_ +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +_stream_usart_putchar writes a character at the USART stream +\end_layout + +\begin_layout Description +_ +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +_stream_mssp_putchar writes a character at the MSSP stream +\end_layout + +\begin_layout Description +putchar dummy function. + This writes a character to a user specified manner. +\end_layout + +\begin_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 +\emph on +__wparam +\emph default + 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: +\end_layout + +\begin_layout LyX-Code +#include <pic18fregs.h> +\begin_inset Newline newline +\end_inset + +#include <stdio.h> +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +PUTCHAR( c ) +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code + PORTA = c; /* dump character c to PORTA */ +\end_layout + +\begin_layout LyX-Code +} +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void main(void) +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code + stdout = STREAM_USER; /* this is not necessary, since stdout points +\end_layout + +\begin_layout LyX-Code + * by default to STREAM_USER */ +\end_layout + +\begin_layout LyX-Code + printf ( +\begin_inset Quotes sld +\end_inset + +This is a printf test +\backslash +n +\begin_inset Quotes srd +\end_inset + +); +\end_layout + +\begin_layout LyX-Code +} +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout Subsubsection +Printing functions +\end_layout + +\begin_layout Standard +PIC16 contains an implementation of the printf-family +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!PIC16 +\end_layout + +\end_inset + + of functions. + There exist the following functions: +\end_layout + +\begin_layout LyX-Code +extern unsigned int sprintf(char *buf, char *fmt, ...); +\end_layout + +\begin_layout LyX-Code +extern unsigned int vsprintf(char *buf, char *fmt, va_list ap); +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +extern unsigned int printf(char *fmt, ...); +\end_layout + +\begin_layout LyX-Code +extern unsigned int vprintf(char *fmt, va_lista ap); +\end_layout + +\begin_layout LyX-Code + +\end_layout + +\begin_layout LyX-Code +extern unsigned int fprintf(FILE *fp, char *fmt, ...); +\end_layout + +\begin_layout LyX-Code +extern unsigned int vfprintf(FILE *fp, char *fmt, va_list ap); +\end_layout + +\begin_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 necessary buffer. + For fprintf and vfprintf +\emph on +fp +\emph default + should be a stream pointer (i.e. + stdout, STREAM_MSSP, etc...). +\end_layout + +\begin_layout Subsubsection +Signals +\end_layout + +\begin_layout Standard +The PIC18F family of microcontrollers supports a number of interrupt sources. + A list of these interrupts is shown in the following table: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align center +\begin_inset Tabular +<lyxtabular version="3" rows="11" columns="4"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top"> +<column alignment="center" valignment="top"> +<column alignment="left" valignment="top"> +<column alignment="center" valignment="top"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signal name +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +signal name +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +description +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_RB +\end_layout + +\end_inset +</cell> +<cell multicolumn="1" alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PORTB change interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_EE +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +EEPROM/FLASH write complete interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_INT0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +INT0 external interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_BCOL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Bus collision interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_INT1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +INT1 external interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_LVD +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Low voltage detect interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_INT2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +INT2 external interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_PSP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Parallel slave port interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_CCP1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +CCP1 module interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_AD +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +AD convertion complete interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_CCP2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +CCP2 module interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_RC +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +USART receive interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_TMR0 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +TMR0 overflow interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_TX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +USART transmit interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_TMR1 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +TMR1 overflow interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_MSSP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SSP receive/transmit interrupt +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_TMR2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +TMR2 matches PR2 interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SIG_TMR3 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +TMR3 overflow interrupt +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\noindent +The prototypes for these names are defined in the header file +\emph on +signal.h +\emph default +. +\end_layout + +\begin_layout Standard +\noindent +In order to simplify signal handling, a number of macros is provided: +\end_layout + +\begin_layout Labeling +\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. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +DEF_INTLOW(name) begin the definition of the interrupt dispatch table for + low priority interrupt. + +\emph on +name +\emph default + is the function name to use. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +DEF_HANDLER(sig,handler) define a handler for signal +\emph on +sig. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +END_DEF end the declaration of the dispatch table. +\end_layout + +\begin_layout Standard +Additionally there are two more macros to simplify the declaration of the + signal handler: +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 + +\series medium +SIGHANDLER(handler) +\series default + this declares the function prototype for the +\emph on +handler +\emph default + function. +\end_layout + +\begin_layout Labeling +\labelwidthstring 00.00.0000 +SIGHANDLERNAKED(handler) same as SIGHANDLER() but declares a naked function. +\end_layout + +\begin_layout Standard +An example of using the macros above is shown below: +\end_layout + +\begin_layout LyX-Code +#include <pic18fregs.h> +\end_layout + +\begin_layout LyX-Code +#include <signal.h> +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +DEF_INTHIGH(high_int) +\end_layout + +\begin_layout LyX-Code +DEF_HANDLER(SIG_TMR0, _tmr0_handler) +\end_layout + +\begin_layout LyX-Code +DEF_HANDLER(SIG_BCOL, _bcol_handler) +\end_layout + +\begin_layout LyX-Code +END_DEF +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +SIGHANDLER(_tmr0_handler) +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code + /* action to be taken when timer 0 overflows */ +\end_layout + +\begin_layout LyX-Code +} +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +SIGHANDLERNAKED(_bcol_handler) +\end_layout + +\begin_layout LyX-Code +{ +\end_layout + +\begin_layout LyX-Code + __asm +\end_layout + +\begin_layout LyX-Code + /* action to be taken when bus collision occurs */ +\end_layout + +\begin_layout LyX-Code + retfie +\end_layout + +\begin_layout LyX-Code + __endasm; +\end_layout + +\begin_layout LyX-Code +} +\end_layout + +\begin_layout Standard + +\series bold +NOTES: +\series default + Special care should be taken when using the above scheme: +\end_layout + +\begin_layout Itemize +do not place a colon (;) at the end of the DEF_* and END_DEF macros. +\end_layout + +\begin_layout Itemize +when declaring SIGHANDLERNAKED handler never forget to use +\emph on +retfie +\emph default + for proper returning. +\end_layout + +\begin_layout Subsection +PIC16 Port – Tips +\end_layout + +\begin_layout Standard +Here you can find some general tips for compiling programs with SDCC/pic16. +\end_layout + +\begin_layout Subsubsection +Stack size +\end_layout + +\begin_layout Standard +The default stack +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16!stack +\end_layout + +\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: +\end_layout + +\begin_layout LyX-Code +printf () --> ltoa () --> ultoa () --> divschar () +\end_layout + +\begin_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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-fomit-frame-pointer might reduce stack usage by not creating unnecessary + stack frames. + Other ways to reduce stack usage may exist. +\end_layout + +\begin_layout Subsection +Known Bugs +\end_layout + +\begin_layout Subsubsection +Extended Instruction Set +\end_layout + +\begin_layout Standard +The PIC16 port emits code which is incompatible with the extended instruction + set available with many newer devices. + Make sure to always explicitly disable it, usually using: +\end_layout + +\begin_layout Itemize + +\family typewriter +#pragma config XINST=OFF +\end_layout + +\begin_layout Standard +or deprecated: +\end_layout + +\begin_layout Itemize + +\family typewriter +static __code char __at(__CONFIG4L) conf4l = /* more flags & */ _XINST_OFF_4L; +\end_layout + +\begin_layout Standard +\noindent +Some devices (namely 18f2455, 18f2550, 18f4455, and 18f4550) use _ENHCPU_OFF_4L + instead of _XINST_OFF_4L. +\end_layout + +\begin_layout Subsubsection +Regression Tests +\end_layout + +\begin_layout Standard +The PIC16 port currently passes most but not all of the tests in SDCC's + regression test +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Regression test (PIC16) +\end_layout + +\end_inset + + suite (see section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Quality-control" + +\end_inset + +), thus no automatic regression tests are currently performed for the PIC16 + target. +\end_layout + +\begin_layout Chapter +Debugging +\end_layout + +\begin_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: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +When writing your code: +\end_layout + +\begin_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, ...) +\end_layout + +\begin_layout Itemize +run a syntax-checking tool like splint +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +splint (syntax checking tool) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +lint (syntax checking tool) +\end_layout + +\end_inset + + (see - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-more-pedantic +\begin_inset CommandInset ref +LatexCommand ref +reference "lyx:more-pedantic-SPLINT" + +\end_inset + +) over the code. +\end_layout + +\begin_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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-more-pedantic +\begin_inset CommandInset ref +LatexCommand ref +reference "lyx:more-pedantic-SPLINT" + +\end_inset + +) on how to handle syntax extensions like __xdata, __at(), ... + +\end_layout + +\begin_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. +\end_layout + +\begin_layout Standard +Debugging on a simulator: +\end_layout + +\begin_layout Itemize +there is a separate section about SDCDB (section +\begin_inset CommandInset ref +LatexCommand ref +reference "cha:Debugging-with-SDCDB" + +\end_inset + +) below. +\end_layout + +\begin_layout Itemize +or (8051 specific) use a free open source/commercial simulator which interfaces + to the AOMF +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +AOMF, AOMF51 +\end_layout + +\end_inset + + file (see +\begin_inset CommandInset ref +LatexCommand ref +reference "OMF file" + +\end_inset + +) optionally generated by SDCC. +\end_layout + +\begin_layout Standard +Debugging On-target: +\end_layout + +\begin_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. +\end_layout + +\begin_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 CommandInset ref +LatexCommand ref +reference "sec:Related-open-source-tools" + +\end_inset + +). +\end_layout + +\begin_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 Index idx +status collapsed + +\begin_layout Plain Layout +Oscilloscope +\end_layout + +\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 for example monitor 2 push-pull + driven pins by connecting one via a 10 +\begin_inset space ~ +\end_inset + +k +\begin_inset Formula $\Omega$ +\end_inset + + resistor and the other one by a 5 +\begin_inset space ~ +\end_inset + +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. +\end_layout + +\begin_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 Index idx +status collapsed + +\begin_layout Plain Layout +ICE (in circuit emulator) +\end_layout + +\end_inset + +). + Usually very expensive. + And very nice to have too. + And usually locks you (for years...) to the devices the ICE can emulate. + +\end_layout + +\begin_layout Itemize +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. + +\begin_inset Newline newline +\end_inset + +Terms to enter into your favourite search engine could be 'remote debugging', + 'gdb stub' or 'inferior debugger'. + (is there one?) +\end_layout + +\begin_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 Index idx +status collapsed + +\begin_layout Plain Layout +AOMF, AOMF51 +\end_layout + +\end_inset + + file (see +\begin_inset CommandInset ref +LatexCommand ref +reference "OMF file" + +\end_inset + +) as input file. + +\end_layout + +\begin_layout Standard +Last not least: +\end_layout + +\begin_layout Itemize +if you are not familiar with any of the following terms you're likely to + run into problems rather sooner than later: +\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?) +\end_layout + +\begin_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. +\end_layout + +\begin_layout Section +Debugging with SDCDB +\begin_inset CommandInset label +LatexCommand label +name "cha:Debugging-with-SDCDB" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCDB (debugger) +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC is distributed with a source level debugger +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Debugger +\end_layout + +\end_inset + +. + The debugger uses a command line interface, the command repertoire of the + debugger has been kept as close to gdb +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gdb +\end_layout + +\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. +\end_layout + +\begin_layout Subsection +Compiling for Debugging +\end_layout + +\begin_layout Standard +The - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-debug +\end_layout + +\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 Index idx +status collapsed + +\begin_layout Plain Layout +<file>.cdb +\end_layout + +\end_inset + + file from the .adb +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +<file>.adb +\end_layout + +\end_inset + + files and the address information. + This .cdb is used by the debugger. +\end_layout + +\begin_layout Subsection +How the Debugger Works +\end_layout + +\begin_layout Standard +When the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\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 Flex URL +status collapsed + +\begin_layout Plain Layout + +http://ec2drv.sourceforge.net/ +\end_layout + +\end_inset + + is an effort to connect directly to the hardware.) +\end_layout + +\begin_layout Subsection +Starting the Debugger SDCDB +\end_layout + +\begin_layout Standard +The debugger can be started using the following command line. + (Assume the file you are debugging has the file name foo). +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcdb foo +\begin_inset Newline newline +\end_inset + + +\family default +\series default + +\begin_inset Newline newline +\end_inset + +The debugger will look for the following files. +\end_layout + +\begin_layout Itemize +foo.c - the source file. +\end_layout + +\begin_layout Itemize +foo.cdb - the debugger symbol information file. +\end_layout + +\begin_layout Itemize +foo.ihx - the Intel hex format +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Intel hex format +\end_layout + +\end_inset + + object file. +\end_layout + +\begin_layout Subsection +SDCDB Command Line Options +\end_layout + +\begin_layout Itemize +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-directory option should be - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-directory=/home/src1:/home/src2. + Note there can be no spaces in the option. + +\end_layout + +\begin_layout Itemize +-cd <directory> - change to the <directory>. +\end_layout + +\begin_layout Itemize +-fullname - used by GUI front ends. +\end_layout + +\begin_layout Itemize +-cpu <cpu-type> - this argument is passed to the simulator please see the + simulator docs for details. +\end_layout + +\begin_layout Itemize +-X <Clock frequency > this options is passed to the simulator please see + the simulator docs for details. +\end_layout + +\begin_layout Itemize +-s <serial port file> passed to simulator see the simulator docs for details. +\end_layout + +\begin_layout Itemize +-S <serial in,out> passed to simulator see the simulator docs for details. +\end_layout + +\begin_layout Itemize +-k <port number> passed to simulator see the simulator docs for details. +\end_layout + +\begin_layout Subsection +SDCDB Debugger Commands +\end_layout + +\begin_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. +\end_layout + +\begin_layout Subsubsection* +break [line | file:line | function | file:function] +\end_layout + +\begin_layout Standard +Set breakpoint at specified line or function: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcdb>break 100 +\begin_inset Newline newline +\end_inset + +sdcdb>break foo.c:100 +\begin_inset Newline newline +\end_inset + +sdcdb>break funcfoo +\begin_inset Newline newline +\end_inset + +sdcdb>break foo.c:funcfoo +\end_layout + +\begin_layout Subsubsection* +clear [line | file:line | function | file:function ] +\end_layout + +\begin_layout Standard +Clear breakpoint at specified line or function: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +sdcdb>clear 100 +\begin_inset Newline newline +\end_inset + +sdcdb>clear foo.c:100 +\begin_inset Newline newline +\end_inset + +sdcdb>clear funcfoo +\begin_inset Newline newline +\end_inset + +sdcdb>clear foo.c:funcfoo +\end_layout + +\begin_layout Subsubsection* +continue +\end_layout + +\begin_layout Standard +Continue program being debugged, after breakpoint. +\end_layout + +\begin_layout Subsubsection* +finish +\end_layout + +\begin_layout Standard +Execute till the end of the current function. +\end_layout + +\begin_layout Subsubsection* +delete [n] +\end_layout + +\begin_layout Standard +Delete breakpoint number 'n'. + If used without any option clear ALL user defined break points. +\end_layout + +\begin_layout Subsubsection* +info [break | stack | frame | registers ] +\end_layout + +\begin_layout Itemize +info break - list all breakpoints +\end_layout + +\begin_layout Itemize +info stack - show the function call stack. +\end_layout + +\begin_layout Itemize +info frame - show information about the current execution frame. +\end_layout + +\begin_layout Itemize +info registers - show content of all registers. +\end_layout + +\begin_layout Subsubsection* +step +\end_layout + +\begin_layout Standard +Step program until it reaches a different source line. + Note: pressing <return> repeats the last command. +\end_layout + +\begin_layout Subsubsection* +next +\end_layout + +\begin_layout Standard +Step program, proceeding through subroutine calls. +\end_layout + +\begin_layout Subsubsection* +run +\end_layout + +\begin_layout Standard +Start debugged program. +\end_layout + +\begin_layout Subsubsection* +ptype variable +\end_layout + +\begin_layout Standard +Print type information of the variable. +\end_layout + +\begin_layout Subsubsection* +print variable +\end_layout + +\begin_layout Standard +print value of variable. +\end_layout + +\begin_layout Subsubsection* +file filename +\end_layout + +\begin_layout Standard +load the given file name. + Note this is an alternate method of loading file for debugging. +\end_layout + +\begin_layout Subsubsection* +frame +\end_layout + +\begin_layout Standard +print information about current frame. +\end_layout + +\begin_layout Subsubsection* +set srcmode +\end_layout + +\begin_layout Standard +Toggle between C source & assembly source. +\end_layout + +\begin_layout Subsubsection* +! simulator command +\end_layout + +\begin_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. +\end_layout + +\begin_layout Subsubsection* +quit +\end_layout + +\begin_layout Standard +"Watch me now. + Iam going Down. + My name is Bobby Brown" +\end_layout + +\begin_layout Subsection +Interfacing SDCDB with DDD +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +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. +\end_layout + +\begin_layout Plain Layout +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_layout + +\end_inset + + +\end_layout + +\begin_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 Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki_images/ddd_example.png +\end_layout + +\end_inset + + +\size default + shows a screenshot of a debugging session with DDD +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DDD (debugger) +\end_layout + +\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. + +\begin_inset Newline newline +\end_inset + +The source was compiled with +\family sans +\series bold + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +sdcc - +\family default +\series default + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\family sans +\series bold +-debug ddd_example.c +\family default +\series default + +\family sans +\series bold + +\begin_inset Newline newline +\end_inset + + +\family default +\series default + +\begin_inset Newline newline +\end_inset + +and DDD was invoked with +\family sans +\series bold + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +ddd -debugger "sdcdb -cpu 8032 ddd_example" +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +Check that the double quotes or an apostrophe within the command line survive + the \SpecialChar LyX + tool chain. + Previously the apostrophes got slanted in the PDF output so a cut and paste + did not work. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Interfacing SDCDB with XEmacs +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +XEmacs +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Emacs +\end_layout + +\end_inset + + +\end_layout + +\begin_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): +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter +(load-file sdcdbsrc.el) +\family default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +.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: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family sans +\series bold +ESC-x sdcdbsrc +\family default +\series default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +You will prompted to enter the file name to be debugged. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The command line options that are passed to the simulator directly are bound + to default values in the file sdcdbsrc.el. + The variables are listed below, these values maybe changed as required. +\end_layout + +\begin_layout Itemize +sdcdbsrc-cpu-type '51 +\end_layout + +\begin_layout Itemize +sdcdbsrc-frequency '11059200 +\end_layout + +\begin_layout Itemize +sdcdbsrc-serial nil +\end_layout + +\begin_layout Standard +The following is a list of key mapping for the debugger interface. +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\family typewriter + +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +Current Listing :: +\begin_inset Newline newline +\end_inset + +;;key +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +binding +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Comment +\begin_inset Newline newline +\end_inset + +;;--- +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +------- +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +------- +\begin_inset Newline newline +\end_inset + +;; +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +n +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-next-from-src +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB next command +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +b +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-back-from-src +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB back command +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +c +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-cont-from-src +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB continue command +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +s +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-step-from-src +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB step command +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +? +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-whatis-c-sexp +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB ptypecommand for data at +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +buffer point +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +x +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-delete +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB Delete all breakpoints if no arg +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +given or delete arg (C-u arg x) +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +m +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-frame +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB Display current frame if no arg, +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +given or display frame arg +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +buffer point +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +! +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-goto-sdcdb +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Goto the SDCDB output buffer +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +p +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-print-c-sexp +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB print command for data at +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +buffer point +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +g +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-goto-sdcdb +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Goto the SDCDB output buffer +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +t +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-mode +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Toggles Sdcdbsrc mode (turns it off) +\begin_inset Newline newline +\end_inset + +;; +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +C-c +\begin_inset space ~ +\end_inset + +C-f +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-finish-from-src +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +SDCDB finish command +\begin_inset Newline newline +\end_inset + +;; +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +C-x +\begin_inset space ~ +\end_inset + +SPC +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdb-break +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Set break for line with point +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +ESC +\begin_inset space ~ +\end_inset + +t +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-mode +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Toggle Sdcdbsrc mode +\begin_inset Newline newline +\end_inset + +;; +\begin_inset space ~ +\end_inset + +ESC +\begin_inset space ~ +\end_inset + +m +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sdcdbsrc-srcmode +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Toggle list mode +\begin_inset Newline newline +\end_inset + +;; +\end_layout + +\begin_layout Chapter +TIPS +\end_layout + +\begin_layout Standard +Here are a few guidelines that will help the compiler generate more efficient + code, some of the tips are specific to this compiler others are generally + good programming practice. +\end_layout + +\begin_layout Itemize +Use the smallest data type to represent your data-value. + If it is known in advance that the value is going to be less than 256 then + use an 'unsigned char' instead of a 'short' or 'int'. + Please note, that ANSI C requires both signed and unsigned chars to be + promoted to 'signed int' +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +promotion to signed int +\end_layout + +\end_inset + + +\begin_inset Marginal +status collapsed + +\begin_layout Plain Layout + +\series bold +\begin_inset space ~ +\end_inset + +! +\end_layout + +\end_inset + + before doing any operation. + This promotion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +type promotion +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "type promotion" + +\end_inset + + can be omitted, if the result is the same. + The effect of the promotion rules together with the sign-extension is often + surprising: +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Verse + +\family typewriter +unsigned char uc = 0xfe; +\begin_inset Newline newline +\end_inset + +if (uc * uc < 0) /* this is true! */ +\begin_inset Newline newline +\end_inset + +{ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard + +\family typewriter +uc * uc +\family default + is evaluated as +\family typewriter +(int) uc * (int) uc = (int) 0xfe * (int) 0xfe = (int) 0xfc04 = -1024 +\family default +. +\begin_inset Newline newline +\end_inset + +Another one: +\end_layout + +\begin_layout Verse + +\family typewriter +(unsigned char) -12 / (signed char) -3 = ... +\end_layout + +\begin_layout Standard +No, the result is not 4: +\end_layout + +\begin_layout Verse + +\family typewriter +(int) (unsigned char) -12 / (int) (signed char) -3 = +\begin_inset Newline newline +\end_inset + +(int) (unsigned char) 0xf4 / (int) (signed char) 0xfd = +\begin_inset Newline newline +\end_inset + +(int) 0x00f4 / (int) 0xfffd = +\begin_inset Newline newline +\end_inset + +(int) 0x00f4 / (int) 0xfffd = +\begin_inset Newline newline +\end_inset + +(int) 244 / (int) -3 = +\begin_inset Newline newline +\end_inset + +(int) -81 = (int) 0xffaf; +\end_layout + +\begin_layout Standard +Don't complain, that gcc gives you a different result. + gcc uses 32 bit ints, while SDCC uses 16 bit ints. + Therefore the results are different. +\begin_inset Newline newline +\end_inset + +From +\begin_inset Quotes sld +\end_inset + +comp.lang.c FAQ +\begin_inset Quotes srd +\end_inset + +: +\end_layout + +\begin_layout Quote + +\emph on +If well-defined overflow characteristics are important and negative values + are not, or if you want to steer clear of sign-extension problems when + manipulating bits or bytes, use one of the corresponding unsigned types. + (Beware when mixing signed and unsigned values in expressions, though.) +\begin_inset Newline newline +\end_inset + +Although character types (especially unsigned char) can be used as "tiny" + integers, doing so is sometimes more trouble than it's worth, due to unpredicta +ble sign extension and increased code size. +\end_layout + +\end_deeper +\begin_layout Itemize +Use unsigned when it is known in advance that the value is not going to + be negative. + This helps especially if you are doing division or multiplication, bit-shifting + or are using an array index. +\end_layout + +\begin_layout Itemize +NEVER jump into a LOOP. +\end_layout + +\begin_layout Itemize +Declare the variables to be local +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +local variables +\end_layout + +\end_inset + + whenever possible, especially loop control variables (induction). +\end_layout + +\begin_layout Itemize +Have a look at the assembly listing to get a +\begin_inset Quotes sld +\end_inset + +feeling +\begin_inset Quotes srd +\end_inset + + for the code generation. +\end_layout + +\begin_layout Section +Porting code from or to other compilers +\begin_inset CommandInset label +LatexCommand label +name "sec:Porting-code-to-other-compilers" + +\end_inset + + +\end_layout + +\begin_layout Itemize +check whether endianness +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Endianness +\end_layout + +\end_inset + + of the compilers differs and adapt where needed. +\end_layout + +\begin_layout Itemize +check the device specific header files +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Header files +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Include files +\end_layout + +\end_inset + + for compiler specific syntax. + Eventually include the file <compiler.h +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +compiler.h (include file) +\end_layout + +\end_inset + +> +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/device/include/mcs51/compiler.h +\end_layout + +\end_inset + + to allow using common header files. + (see f.e. + cc2510fx.h +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/device/include/mcs51/cc2510fx.h +\end_layout + +\end_inset + +). +\end_layout + +\begin_layout Itemize +check whether the startup code contains the correct initialization (watchdog +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +watchdog +\end_layout + +\end_inset + +, peripherals). +\end_layout + +\begin_layout Itemize +check whether the sizes of short, int, long match. +\end_layout + +\begin_layout Itemize +check if some 16 or 32 bit hardware registers require a specific addressing + order (least significant or most significant byte first) and adapt if needed + ( +\emph on +first +\emph default + and +\emph on +last +\emph default + relate to time and not to lower/upper memory location here, so this is + +\emph on +not +\emph default + the same as endianness). +\end_layout + +\begin_layout Itemize +check whether the keyword +\emph on +volatile +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +volatile +\end_layout + +\end_inset + + +\emph default + is used where needed. + The compilers might differ in their optimization characteristics (as different + versions of the same compiler might also use more clever optimizations + this is good idea anyway). + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Common-interrupt-pitfall-volatile" + +\end_inset + +. +\end_layout + +\begin_layout Itemize +check that the compilers are not told to suppress warnings. +\end_layout + +\begin_layout Itemize +check and convert compiler specific extensions (interrupts, memory areas, + pragmas etc.). +\end_layout + +\begin_layout Itemize +check for differences in type promotion. + Especially check for math operations on +\family typewriter +char +\family default + or +\family typewriter +unsigned char +\family default + variables. + For the sake of C99 compatibility SDCC will probably promote these to +\family typewriter +int +\family default + more often than other compilers. + Eventually insert explicit casts to +\family typewriter +(char) +\family default + or +\family typewriter +(unsigned char) +\family default +. + Also check that the ~ +\begin_inset space ~ +\end_inset + +operator +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +~ Operator +\end_layout + +\end_inset + + is not used on +\family typewriter +bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +bit +\end_layout + +\end_inset + + +\family default + variables, use the ! +\begin_inset space ~ +\end_inset + +operator instead. + See sections +\begin_inset CommandInset ref +LatexCommand ref +reference "type promotion" + +\end_inset + + and +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Compatibility-with-previous" + +\end_inset + +. +\end_layout + +\begin_layout Itemize +check the assembly code generated for interrupt routines (f.e. + for calls to possibly non-reentrant library functions). +\end_layout + +\begin_layout Itemize +check whether timing loops result in proper timing (or preferably consider + a rewrite of the code with timer based delays instead). +\end_layout + +\begin_layout Itemize +check for differences in printf parameters +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!parameters +\end_layout + +\end_inset + + (some compilers push (va_arg +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +vararg, va +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +_ +\end_layout + +\end_inset + +arg +\end_layout + +\end_inset + +) char variables as +\family typewriter +int +\family default + others push them as +\family typewriter +char +\family default +. + See section +\begin_inset CommandInset ref +LatexCommand ref +reference "sec:Compatibility-with-previous" + +\end_inset + +). + Provide a putchar() +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +printf()!putchar() +\end_layout + +\end_inset + + function if needed. +\end_layout + +\begin_layout Itemize +check the resulting memory map +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Memory map +\end_layout + +\end_inset + +. + Usage of different memory spaces: code, stack, data (for mcs51/ds390 additional +ly idata, pdata, xdata). + Eventually check if unexpected library functions are included. +\end_layout + +\begin_layout Section +Tools +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Tools +\end_layout + +\end_inset + + included in the distribution +\end_layout + +\begin_layout Standard +\align left +\begin_inset Tabular +<lyxtabular version="3" rows="28" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top" width="0pt"> +<column alignment="left" valignment="top" width="0pt"> +<column alignment="left" valignment="top" width="0pt"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Name +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Purpose +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Directory +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +as2gbmap.py +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdas map to rrgb map and no$gmb sym file format converter +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cinc2h.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +gpasm inc to c header file converter +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +gen_known_bugs.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +generate knownbugs.html +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +keil2sdcc.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Keil header +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Header files +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Include files +\end_layout + +\end_inset + + to SDCC header file converter +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +makebin +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Intel Hex to binary and GameBoy binay format converter +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +mcs51-disasm.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +disassembler to the mcs51 instructions contained hex files +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +mh2h.c +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +header file conversion +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +optimize_pic16devices.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +optimizes or unoptimizes the pic16devices.txt file +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +packihx +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Intel Hex packer +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +packihx (tool) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pic14-header-parser.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +helper to realization of peripheral-handling (PIC14) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pic16-header-parser.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +helper to realization of peripheral-handling (PIC16) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pic16fam-h-gen.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +helper to realization of peripheral-handling (PIC14) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +pic18fam-h-gen.pl +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +helper to realization of peripheral-handling (PIC16) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +repack_release.sh +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +repack sdcc to release package +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdas390 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +assembler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdas6808 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +assembler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdas8051 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +assembler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdasgb +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +assembler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdasz80 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +assembler +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc_cygwin_mingw32 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cross compile the sdcc with mingw32 under Cygwin +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc_mingw32 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cross compile the sdcc with mingw32 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/support/scripts +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SDCDB +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +simulator +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdld +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdld6808 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdldgb +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdldz80 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/bin +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +uCsim +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +uCsim +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +simulator for various architectures +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/sim/ucsim +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Section +Documentation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Documentation +\end_layout + +\end_inset + + included in the distribution +\end_layout + +\begin_layout Standard +\align left +\begin_inset Tabular +<lyxtabular version="3" rows="10" columns="2"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="40col%"> +<column alignment="block" valignment="top" width="60col%"> +<row endhead="true"> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Subject / Title +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Filename / Where to get +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SDCC Compiler User Guide +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +You're reading it right now +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/doc/sdccman.pdf +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Changelog of SDCC +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/Changelog +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/ChangeLog +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +ASXXXX +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdas (sdasgb, sdas6808, sdas8051, sdasz80) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler documentation +\end_layout + +\end_inset + + Assemblers and +\begin_inset Newline newline +\end_inset + +ASLINK +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +sdld +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Linker documentation +\end_layout + +\end_inset + + Relocating Linker +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/sdas/doc/asmlnk.txt +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/sdas/doc/asmlnk.txt +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SDCC regression test +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Regression test +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +test_suite_spec +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/index.php/Proposed_Test_Suite_Design +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Various notes +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/doc/* +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/doc/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Notes on debugging with SDCDB +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCDB (debugger) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/debugger/README +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at +\emph default +: +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/debugger/README +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +uCsim +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +uCsim +\end_layout + +\end_inset + + Software simulator for microcontrollers +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +sdcc/sim/ucsim/doc +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +/index.html +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/sim/ucsim/doc/index.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Temporary notes on the pic16 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +PIC16 +\end_layout + +\end_inset + + port +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/src/pic16/NOTES +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\begin_inset Newline newline +\end_inset + + +\emph default + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/src/pic16/NOTES +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +SDCC internal documentation (debugging file format) +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc/doc/ +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +cdbfileformat.pd +\family default +\series default +\shape default +\size default +\emph default +\bar default +\noun default +f +\emph on + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space \hfill{} +\end_inset + +online at: +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/index.php/CDB_File_Format +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Section +Communication online at SourceForge +\end_layout + +\begin_layout Standard +\begin_inset Tabular +<lyxtabular version="3" rows="8" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top" width="30col%"> +<column alignment="left" valignment="top" width="30col%"> +<column alignment="left" valignment="top" width="40col%"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Subject / Title +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Note +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Link +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +wiki +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +wiki +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!wiki +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc-user mailing list +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +mailing list +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Mailing lists +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +around 650 subscribers mid 2009 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +https://lists.sourceforge.net/mailman/listinfo/sdcc-user +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +sdcc-devel mailing list +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +https://lists.sourceforge.net/mailman/listinfo/sdcc-devel +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +help forum +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Forums +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +similar scope as sdcc-user mailing list +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/discussion/1865 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +open discussion forum +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/discussion/1864 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +trackers (bug tracker, feature requests, patches, support requests, webdocs) +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Trackers +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/_list/tickets +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +rss feed +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +RSS feed +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!RSS feed +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +stay tuned with most (not all) sdcc activities +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/export/rss2_keepsake.php?group_id=599 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +With a sourceforge account you can +\begin_inset Quotes sld +\end_inset + +monitor +\begin_inset Quotes srd +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Monitor +\end_layout + +\end_inset + + forums and trackers, so that you automatically receive mail on changes. + You can digg out earlier communication by using the search function +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/search/?group_id=599 +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +Related open source tools +\begin_inset CommandInset label +LatexCommand label +name "sec:Related-open-source-tools" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Related tools +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\align left +\begin_inset Tabular +<lyxtabular version="3" rows="16" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top" width="20col%"> +<column alignment="block" valignment="top" width="30col%"> +<column alignment="left" valignment="top" width="50col%"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Name +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Purpose +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Where to get +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +gpsim +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gpsim (pic simulator) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PIC simulator +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.dattalo.com/gnupic/gpsim.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +gputils +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +gputils (pic tools) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +GNU PIC utilities +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/gputils +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +flP5 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +PIC programmer +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://freshmeat.net/projects/flp5/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +ec2drv/newcdb +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Tools for Silicon Laboratories JTAG debug adapter, partly based on SDCDB + (Unix only) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/ec2drv +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +indent +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +indent (source formatting tool) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Formats C source - Master of the white spaces +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://directory.fsf.org/GNU/indent.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +srecord +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +srecord (bin, hex, ... + tool) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Object file conversion, checksumming, ... +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/srecord +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +objdump +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +objdump (tool) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Object file conversion, ... +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Part of binutils (should be there anyway) +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cmon51 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8051 monitor (hex up-/download, single step, disassemble) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/cmon51 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +doxygen +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +doxygen (source documentation tool) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Source code documentation system +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.doxygen.org +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +kdevelop +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +IDE (has anyone tried integrating SDCC & SDCDB? Unix only) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.kdevelop.org +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +paulmon +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +8051 monitor (hex up-/download, single step, disassemble) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.pjrc.com/tech/8051/paulmon2.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +splint +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +splint (syntax checking tool) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Statically checks c sources (see +\begin_inset CommandInset ref +LatexCommand ref +reference "lyx:more-pedantic-SPLINT" + +\end_inset + +) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.splint.org +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +ddd +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DDD (debugger) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Debugger, serves nicely as GUI to SDCDB +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCDB (debugger) +\end_layout + +\end_inset + + (Unix only) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.gnu.org/software/ddd/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +d52 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +d52 +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +d52 (disassembler) +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Disassembler, can count instruction cycles +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +instruction cycles (count) +\end_layout + +\end_inset + +, use with options -pnd +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.8052.com/users/disasm/ +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +cmake +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +cmake +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Cross platform build system, generates Makefiles +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Makefile +\end_layout + +\end_inset + + and project workspaces +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +project workspace +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.cmake.org +\end_layout + +\end_inset + + and a dedicated wiki entry: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.cmake.org/Wiki/CmakeSdcc +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Section +Related documentation / recommended reading +\end_layout + +\begin_layout Standard +\align left +\begin_inset Tabular +<lyxtabular version="3" rows="7" columns="3"> +<features tabularvalignment="middle"> +<column alignment="left" valignment="top" width="20col%"> +<column alignment="left" valignment="top" width="30col%"> +<column alignment="left" valignment="top" width="50col%"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Name +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Subject / Title +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Where to get +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\family roman +\series medium +\shape up +\size normal +\emph off +\bar no +\noun off +\color none +c-refcard.pdf +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +C Reference Card +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +C Reference card +\end_layout + +\end_inset + +, 2 pages +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://refcards.com/refcards/c/index.html +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +c-faq +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +C-FAQ +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +C FAQ +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.c-faq.com +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +ISO/IEC 9899:TC2 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Quotes sld +\end_inset + +C-Standard +\begin_inset Quotes srd +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.open-std.org/jtc1/sc22/wg14/www/standards.html#9899 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +ISO/IEC DTR 18037 +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +\begin_inset Quotes sld +\end_inset + +Extensions for Embedded C +\begin_inset Quotes srd +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1021.pdf +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Latest datasheet of target CPU +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +vendor +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +Revision history of datasheet +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout +vendor +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Section +Application notes specifically for SDCC +\end_layout + +\begin_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 Index idx +status collapsed + +\begin_layout Plain Layout +Application notes +\end_layout + +\end_inset + +. +\begin_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_layout Standard +\align left + +\size footnotesize +\begin_inset Tabular +<lyxtabular version="3" rows="7" columns="3"> +<features tabularvalignment="middle"> +<column alignment="block" valignment="top" width="17col%"> +<column alignment="block" valignment="top" width="27col%"> +<column alignment="block" valignment="top" width="56col%"> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +\size footnotesize +Vendor +\end_layout + +\end_inset +</cell> +<cell alignment="left" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +\size footnotesize +Subject / Title +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +\size footnotesize +Where to get +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Maxim / Dallas +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Using the SDCC Compiler for the DS80C400 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS80C400 +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://pdfserv.maxim-ic.com/en/an/AN3346.pdf +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Maxim / Dallas +\end_layout + +\end_inset +</cell> +<cell multicolumn="1" alignment="left" valignment="top" topline="true" leftline="true" usebox="none" width="30line%"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Using the Free SDCC C Compiler to Develop Firmware for the DS89C420/430/440/450 +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +DS89C4x0 +\end_layout + +\end_inset + + Family of Microcontrollers +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://pdfserv.maxim-ic.com/en/an/AN3477.pdf +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Silicon Laboratories / Cygnal +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Integrating SDCC 8051 Tools Into The Silicon Labs IDE +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +IDE +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.silabs.com/public/documents/tpub_doc/anote/Microcontrollers/en/an198.pdf +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Ramtron / Goal Semiconductor +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Interfacing SDCC to Syn and Textpad +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Ramtron / Goal Semiconductor +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Installing and Configuring SDCC and Crimson Editor +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.ramtron.com/doc/Products/Microcontroller/Support_Tools.asp +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Texas Instruments +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +MSC12xx Programming with SDCC +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://focus.ti.com/general/docs/lit/getliterature.tsp?literatureNumber=sbaa109&fil +eType=pdf +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Section +Some Questions +\end_layout + +\begin_layout Standard +Some questions answered, some pointers given - it might be time to in turn + ask +\emph on +you +\emph default + some questions: +\end_layout + +\begin_layout Itemize +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? +\end_layout + +\begin_layout Itemize +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? +\end_layout + +\begin_layout Itemize +if you solved the problem, will the marketing department be happy? +\end_layout + +\begin_layout Itemize +if the marketing department is happy, will customers be happy? +\end_layout + +\begin_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? +\end_layout + +\begin_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? +\end_layout + +\begin_layout Itemize +is your project adequately positioned in that magic triangle: fame, fortune, + fun? +\end_layout + +\begin_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 +status collapsed + +\begin_layout Plain Layout +burnout is bad for electronic devices, programmers and motorcycle tyres +\end_layout + +\end_inset + +. + Chances are you didn't want to hear some of them... +\end_layout + +\begin_layout Chapter +Support +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Support +\end_layout + +\end_inset + + +\end_layout + +\begin_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. + +\end_layout + +\begin_layout Standard +The SDCC project is hosted on the SDCC SourceForge site at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/sdcc +\end_layout + +\end_inset + +. + You'll find the complete set of mailing lists +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Mailing list(s) +\end_layout + +\end_inset + +, forums, bug reporting system, patch submission +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Patch submission +\end_layout + +\end_inset + + system, wiki, rss-feed, download +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +download +\end_layout + +\end_inset + + area and Subversion code repository +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Subversion code repository +\end_layout + +\end_inset + + there. +\end_layout + +\begin_layout Section +Reporting Bugs +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Bug reporting +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Reporting bugs +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Bug report +\end_layout + +\end_inset + + +\end_layout + +\begin_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. +\end_layout + +\begin_layout Standard +Bug reports are automatically forwarded to the developer mailing list and + will be fixed ASAP. + When reporting a bug, it is very useful to include a small test program + (the smaller the better) which reproduces the problem. + If you can isolate the problem by looking at the generated assembly code, + this can be very helpful. + Compiling your program with the - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dumpall +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dumpall +\end_layout + +\end_inset + + option can sometimes be useful in locating optimization problems. + When reporting a bug please make sure you: +\end_layout + +\begin_layout Enumerate +Attach the code you are compiling with SDCC. + +\end_layout + +\begin_layout Enumerate +Specify the exact command you use to run SDCC, or attach your Makefile. + +\end_layout + +\begin_layout Enumerate +Specify the SDCC version (type " +\family sans +\series bold +sdcc -v +\family default +\series default +"), your platform, and operating system. + +\end_layout + +\begin_layout Enumerate +Provide an exact copy of any error message or incorrect output. + +\end_layout + +\begin_layout Enumerate +Put something meaningful in the subject of your message. +\end_layout + +\begin_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! +\end_layout + +\begin_layout Standard +Please have a short check that you are using a recent version of SDCC and + the bug is not yet known. + This is the link for reporting bugs: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/bugs/ +\end_layout + +\end_inset + +. + With SDCC on average having more than 200 downloads +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +download +\end_layout + +\end_inset + + on SourceForge per day +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +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_layout + +\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: +\emph on +reporting bugs is good +\emph default +. +\end_layout + +\begin_layout Section +Requesting Features +\begin_inset CommandInset label +LatexCommand label +name "subsec:Requesting-Features" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Feature request +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Requesting features +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Feature request +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Like bug reports feature requests are forwarded to the developer mailing + list. + This is the link for requesting features: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/feature-requests/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +Submitting patches +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Patch submission +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Like bug reports contributed patches are forwarded to the developer mailing + list. + This is the link for submitting patches +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Patch submission +\end_layout + +\end_inset + +: +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/patches/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_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 + +\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 + +diff -u sourcefile.c.orig sourcefile.c >my_changes.patch +\begin_inset Quotes srd +\end_inset + + +\family default +\series default + will do. +\end_layout + +\begin_layout Section +Getting Help +\end_layout + +\begin_layout Standard +These links should take you directly to the Mailing lists +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/mailman/sdcc-user/ +\end_layout + +\end_inset + + +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting + automated messages (mid 2003) +\end_layout + +\end_inset + + and the Forums +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/discussion/ +\end_layout + +\end_inset + +, lists +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Mailing list(s) +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Communication!Mailing lists +\end_layout + +\end_inset + + 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. +\end_layout + +\begin_layout Section +ChangeLog +\end_layout + +\begin_layout Standard +You can follow the status of the Subversion version +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +version +\end_layout + +\end_inset + + of SDCC by watching the Changelog +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Changelog +\end_layout + +\end_inset + + in the Subversion repository +\size footnotesize + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://svn.code.sf.net/p/sdcc/code/trunk/sdcc/ChangeLog +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Section +Subversion Source Code Repository +\end_layout + +\begin_layout Standard +The output of +\family sans +\series bold +sdcc - +\family default + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\family sans +-version +\family default +\series default + or the filenames of the snapshot versions of SDCC include date and its + Subversion +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Subversion code repository +\end_layout + +\end_inset + + number. + Subversion allows to download the source of recent or previous versions + +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/code/8805/tree/ +\end_layout + +\end_inset + + (by number or by date). +\end_layout + +\begin_layout Section +Release policy +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Release policy +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Starting with version 2.4.0 SDCC in 2004 uses a time-based release schedule + with one official release usually during the first half of the year. +\end_layout + +\begin_layout Standard +The last digit of an official release is zero. + Additionally there are daily snapshots available at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + +, and you can always build the very last version from the source code available + at Sourceforge +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php#Source +\end_layout + +\end_inset + +. + The SDCC Wiki +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +wiki +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +SDCC Wiki +\end_layout + +\end_inset + + at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/ +\end_layout + +\end_inset + + also holds some information about past and future releases. +\end_layout + +\begin_layout Section +Quality control +\begin_inset CommandInset label +LatexCommand label +name "sec:Quality-control" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Quality control +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The compiler is passed through +\shape italic +daily +\shape default + snapshot build compile and build checks. + The so called +\shape italic +regression tests +\shape default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Regression test +\end_layout + +\end_inset + + check that SDCC itself compiles flawlessly on several host platforms (i386, + Opteron, 64 bit Alpha, ppc64, Mac OS X on ppc and i386, 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 about 1000 files which expand to more + than 1500 test cases which include about 7000 tests. + A large number of tests from the GCC test suite is included in this. + 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 Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/snap.php +\end_layout + +\end_inset + +). +\end_layout + +\begin_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 + +make test-mcs51 +\begin_inset Quotes srd +\end_inset + + +\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 Index idx +status collapsed + +\begin_layout Plain Layout +Examples +\end_layout + +\end_inset + + checking corner cases of SDCC or if you plan to submit patches +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Patch submission +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Standard +The PIC14 port uses a different set of regression tests +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Regression test (PIC14) +\end_layout + +\end_inset + +, you'll find them in the directory +\shape italic +sdcc/src/regression +\shape default +. +\end_layout + +\begin_layout Section +Examples +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Examples +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +You'll find some small examples in the directory +\emph on +sdcc/device/examples/. + +\emph default + More examples and libraries are available at +\emph on +The SDCC Open Knowledge Resource +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdccokr.dl9sec.de/ +\end_layout + +\end_inset + + +\emph default + web site or at +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.pjrc.com/tech/8051/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +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). +\end_layout + +\begin_layout Plain Layout +Maybe we should include some links to real world applications. + Preferably pointer to pointers (one for each architecture) so this stays + manageable here? +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +Use of SDCC in Education +\end_layout + +\begin_layout Standard +In short: +\emph on +highly +\emph default + encouraged +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +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_layout + +\end_inset + +. + If your rationales are to: +\end_layout + +\begin_layout Enumerate +give students a chance to understand the +\emph on +complete +\emph default + steps of code generation +\end_layout + +\begin_layout Enumerate +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 (http://www.opencores.org +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +opencores.org +\end_layout + +\end_inset + +, Oregano +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.oregano.at/ip/ip01.htm +\end_layout + +\end_inset + +), over assembly programming, to C to FPGA compilers (FPGAC +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/projects/fpgac/ +\end_layout + +\end_inset + +) and to C. +\end_layout + +\begin_layout Enumerate +be able to insert excursions about skills like using a revision control + system, submitting/applying patches, using a type-setting (as opposed to + word-processing) engine \SpecialChar LyX +/\SpecialChar LaTeX +, using SourceForge +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/ +\end_layout + +\end_inset + +, following some netiquette +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://en.wikipedia.org/wiki/Netiquette +\end_layout + +\end_inset + +, understanding BSD/LGPL/GPL/Proprietary licensing, growth models of Open + Source Software, CPU simulation, compiler regression tests +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Regression test +\end_layout + +\end_inset + +. + +\begin_inset Newline newline +\end_inset + +And if there should be a shortage of ideas then you can always point students + to the ever-growing feature request list +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/p/sdcc/feature-requests/ +\end_layout + +\end_inset + +. +\end_layout + +\begin_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, Mac OS X, Mips, Sparc, Windows + and eventually OLPC +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://www.laptop.org +\end_layout + +\end_inset + +) +\end_layout + +\begin_layout Enumerate +not encourage students to use illegal copies of educational software +\end_layout + +\begin_layout Enumerate +be immune to licensing/availability/price changes of the chosen tool chain +\end_layout + +\begin_layout Enumerate +be able to change to a new target platform without having to adopt a new + tool chain +\end_layout + +\begin_layout Enumerate +have complete control over and insight into the tool chain +\end_layout + +\begin_layout Enumerate +make your students aware about the pros and cons of open source software + development +\end_layout + +\begin_layout Enumerate +give back to the public as you are probably at least partially publicly + funded +\end_layout + +\begin_layout Enumerate +give students a chance to publicly prove their skills and to possibly see + a world wide impact +\end_layout + +\begin_layout Standard +then SDCC is probably among the first choices. + Well, probably SDCC might be the only choice. +\end_layout + +\begin_layout Chapter +SDCC Technical Data +\end_layout + +\begin_layout Section +Optimizations +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Optimizations +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC performs a host of standard optimizations in addition to some MCU specific + optimizations. + +\end_layout + +\begin_layout Subsection +Sub-expression Elimination +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Subexpression elimination +\end_layout + +\end_inset + + +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +i = x + y + 1; +\begin_inset Newline newline +\end_inset + +j = x + y; +\end_layout + +\begin_layout Standard +will be translated to +\end_layout + +\begin_layout Verse + +\family typewriter +iTemp = x + y; +\begin_inset Newline newline +\end_inset + +i = iTemp + 1; +\begin_inset Newline newline +\end_inset + +j = iTemp; +\end_layout + +\begin_layout Standard +Some subexpressions are not as obvious as the above example, e.g.: +\end_layout + +\begin_layout Verse + +\family typewriter +a->b[i].c = 10; +\begin_inset Newline newline +\end_inset + +a->b[i].d = 11; +\end_layout + +\begin_layout Standard +In this case the address arithmetic a->b[i] will be computed only once; + the equivalent code in C would be. +\end_layout + +\begin_layout Verse + +\family typewriter +iTemp = a->b[i]; +\begin_inset Newline newline +\end_inset + +iTemp.c = 10; +\begin_inset Newline newline +\end_inset + +iTemp.d = 11; +\end_layout + +\begin_layout Standard +The compiler will try to keep these temporary variables in registers. +\end_layout + +\begin_layout Subsection +Dead-Code Elimination +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Dead-code elimination +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Verse + +\family typewriter +int global; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void f () { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int i; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +i = 1; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* dead store */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +global = 1; +\begin_inset space ~ +\end_inset + +/* dead store */ +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +global = 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +global = 3; +\begin_inset space ~ +\end_inset + +/* unreachable */ +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +will be changed to +\end_layout + +\begin_layout Verse + +\family typewriter +int global; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +void f () { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +global = 2; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Subsection +Copy-Propagation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Copy propagation +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Verse + +\family typewriter +int f() { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int i, j; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +i = 10; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +j = i; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return j; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +will be changed to +\end_layout + +\begin_layout Verse + +\family typewriter +int f() { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int i, j; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +i = 10; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +j = 10; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return 10; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +Note: the dead stores created by this copy propagation will be eliminated + by dead-code elimination. +\end_layout + +\begin_layout Subsection +Loop Optimizations +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Loop optimization +\end_layout + +\end_inset + + +\begin_inset CommandInset label +LatexCommand label +name "subsec:Loop-Optimizations" + +\end_inset + + +\end_layout + +\begin_layout Standard +Two types of loop optimizations are done by SDCC +\emph on +loop invariant +\emph default + lifting and +\emph on +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 Index idx +status collapsed + +\begin_layout Plain Layout +Register allocation +\end_layout + +\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 Index idx +status collapsed + +\begin_layout Plain Layout +stack +\end_layout + +\end_inset + + / data space. + The compiler will generate a warning message when it is forced to allocate + extra space either on the stack or data space. + If this extra space allocation is undesirable then induction optimization + can be eliminated either for the entire source file (with - +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-noinduction option) or for a given function only using #pragma +\begin_inset space ~ +\end_inset + +noinduction +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +# +\end_layout + +\end_inset + +pragma noinduction +\end_layout + +\end_inset + +. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Loop Invariant: +\end_layout + +\begin_layout Verse + +\family typewriter +for (i = 0 ; i < 100 ; i ++) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +f += k + l; +\end_layout + +\begin_layout Standard +changed to +\end_layout + +\begin_layout Verse + +\family typewriter +itemp = k + l; +\begin_inset Newline newline +\end_inset + +for (i = 0; i < 100; i++) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +f += itemp; +\end_layout + +\begin_layout Standard +As mentioned previously some loop invariants are not as apparent, all static + address computations are also moved out of the loop. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Strength Reduction +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Strength reduction +\end_layout + +\end_inset + +, this optimization substitutes an expression by a cheaper expression: +\end_layout + +\begin_layout Verse + +\family typewriter +for (i=0;i < 100; i++) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ar[i*5] = i*3; +\end_layout + +\begin_layout Standard +changed to +\end_layout + +\begin_layout Verse + +\family typewriter +itemp1 = 0; +\begin_inset Newline newline +\end_inset + +itemp2 = 0; +\begin_inset Newline newline +\end_inset + +for (i=0;i< 100;i++) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ar[itemp1] = itemp2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +itemp1 += 5; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +itemp2 += 3; +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +The more expensive multiplication +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Multiplication +\end_layout + +\end_inset + + is changed to a less expensive addition. +\end_layout + +\begin_layout Subsection +Loop Reversing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Loop reversing +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +This optimization is done to reduce the overhead of checking loop boundaries + for every iteration. + Some simple loops can be reversed and implemented using a +\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). +\end_layout + +\begin_layout Itemize +The 'for' loop is of the form +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\family typewriter +for(<symbol> = <expression>; <sym> [< | <=] <expression>; [<sym>++ | <sym> + += 1]) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +<for body> +\end_layout + +\begin_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 + +. +\end_layout + +\begin_layout Itemize +All goto's are contained within the loop. +\end_layout + +\begin_layout Itemize +No function calls within the loop. +\end_layout + +\begin_layout Itemize +The loop control variable <sym> is not assigned any value within the loop +\end_layout + +\begin_layout Itemize +The loop control variable does NOT participate in any arithmetic operation + within the loop. +\end_layout + +\begin_layout Itemize +There are NO switch statements in the loop. +\end_layout + +\begin_layout Subsection +Algebraic Simplifications +\end_layout + +\begin_layout Standard +SDCC does numerous algebraic simplifications, the following is a small sub-set + of these optimizations. +\end_layout + +\begin_layout Verse + +\family typewriter +i = j + 0; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + /* changed to: */ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + i = j; +\begin_inset Newline newline +\end_inset + +i /= 2; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + /* for unsigned i changed to: */ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + i >>= 1; +\begin_inset Newline newline +\end_inset + +i = j - j; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + /* changed to: */ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + i = 0; +\begin_inset Newline newline +\end_inset + +i = j / 1; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + /* changed to: */ +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + i = j; +\end_layout + +\begin_layout Standard +Note the subexpressions +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Subexpression +\end_layout + +\end_inset + + given above are generally introduced by macro expansions or as a result + of copy/constant propagation. +\end_layout + +\begin_layout Subsection +'switch' Statements +\begin_inset CommandInset label +LatexCommand label +name "subsec:'switch'-Statements" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +switch statement +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC can optimize switch statements to jump tables +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +jump tables +\end_layout + +\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: +\end_layout + +\begin_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_inset Separator latexpar +\end_inset + + +\end_layout + +\begin_deeper +\begin_layout Verse + +\family typewriter +switch(i) { +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +switch (i) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 4: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 0: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 5: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 1: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 3: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 6: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 3: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 7: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 4: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 8: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 5: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 9: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 6: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 10: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 7: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 11: ... +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 8: ... +\begin_inset Newline newline +\end_inset + +} +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +} +\end_layout + +\begin_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_layout + +\end_deeper +\begin_layout Itemize +The number of case labels is not larger than supported by the target architectur +e. +\end_layout + +\begin_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. + +\end_layout + +\begin_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, + ... + . +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +switch (i) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 1: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 2: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 3: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 4: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 5: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 6: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 7: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 101: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 102: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 103: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 104: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 105: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 106: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 107: ... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +If the above switch statement is broken down into two switch statements +\end_layout + +\begin_layout Verse + +\family typewriter +switch (i) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 1: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 2: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 3: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 4: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 5: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 6: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 7: ... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +and +\end_layout + +\begin_layout Verse + +\family typewriter +switch (i) { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 101: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 102: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 103: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 104: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 105: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 106: ... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +case 107: ... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +then both the switch statements will be implemented using jump-tables whereas + the unmodified switch statement will not be. +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +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_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Bit-shifting Operations +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Bit shifting +\end_layout + +\end_inset + +. +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +unsigned char i; +\begin_inset Newline newline +\end_inset + +... +\begin_inset Newline newline +\end_inset + +i >>= 4; +\begin_inset Newline newline +\end_inset + +... +\end_layout + +\begin_layout Standard +generates the following code: +\end_layout + +\begin_layout Verse + +\family typewriter +mov +\begin_inset space ~ +\end_inset + + a,_i +\begin_inset Newline newline +\end_inset + +swap a +\begin_inset Newline newline +\end_inset + +anl +\begin_inset space ~ +\end_inset + + a,#0x0f +\begin_inset Newline newline +\end_inset + +mov +\begin_inset space ~ +\end_inset + + _i,a +\end_layout + +\begin_layout Standard +In general SDCC will never setup a loop if the shift count is known. + Another example: +\end_layout + +\begin_layout Verse + +\family typewriter +unsigned int i; +\begin_inset Newline newline +\end_inset + +... +\begin_inset Newline newline +\end_inset + +i >>= 9; +\begin_inset Newline newline +\end_inset + +... +\end_layout + +\begin_layout Standard +will generate: +\end_layout + +\begin_layout Verse + +\family typewriter +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,(_i + 1) +\begin_inset Newline newline +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +(_i + 1),#0x00 +\begin_inset Newline newline +\end_inset + +clr +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +c +\begin_inset Newline newline +\end_inset + +rrc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a +\begin_inset Newline newline +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_i,a +\end_layout + +\begin_layout Subsection +Bit-rotation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Bit rotation +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +A special case of the bit-shift operation is bit rotation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +rotating bits +\end_layout + +\end_inset + +, SDCC recognizes the following expression to be a left bit-rotation: +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +unsigned +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +char i; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* unsigned is needed for rotation */ +\begin_inset Newline newline +\end_inset + +... +\begin_inset Newline newline +\end_inset + +i = ((i << 1) | (i >> 7)); +\family default + +\begin_inset Newline newline +\end_inset + + +\family typewriter +... +\end_layout + +\begin_layout Standard +will generate the following code: +\end_layout + +\begin_layout Verse + +\family typewriter +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a,_i +\begin_inset Newline newline +\end_inset + +rl +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +a +\begin_inset Newline newline +\end_inset + +mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +_i,a +\end_layout + +\begin_layout Standard +SDCC uses pattern matching on the parse tree to determine this operation.Variatio +ns of this case will also be recognized as bit-rotation, i.e.: +\end_layout + +\begin_layout Verse + +\family typewriter +i = ((i >> 7) | (i << 1)); /* left-bit rotation */ +\end_layout + +\begin_layout Subsection +Nibble and Byte Swapping +\end_layout + +\begin_layout Standard +Other special cases of the bit-shift operations are nibble or byte swapping +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +swapping nibbles/bytes +\end_layout + +\end_inset + +, SDCC recognizes the following expressions: +\end_layout + +\begin_layout Verse + +\family typewriter +\series bold +unsigned +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +char i; +\begin_inset Newline newline +\end_inset + + +\series bold +unsigned +\series default + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int j; +\begin_inset Newline newline +\end_inset + +... +\begin_inset Newline newline +\end_inset + +i = ((i << 4) | (i >> 4)); +\family default + +\begin_inset Newline newline +\end_inset + + +\family typewriter +j = ((j << 8) | (j >> 8)); +\end_layout + +\begin_layout Standard +and generates a swap instruction for the nibble swapping +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Nibble swapping +\end_layout + +\end_inset + + or move instructions for the byte swapping +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Byte swapping +\end_layout + +\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. +\end_layout + +\begin_layout Standard +Note that SDCC stores numbers in little-endian +\begin_inset Foot +status collapsed + +\begin_layout Plain Layout +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 Index idx +status collapsed + +\begin_layout Plain Layout +DPTR +\end_layout + +\end_inset + +-datapointer so little-endian is the more efficient byte order. +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +little-endian +\end_layout + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Endianness +\end_layout + +\end_inset + + format (i.e. + lowest order first) for most backends. + However, the hc08, s08 and stm8 backends are big-endian. +\end_layout + +\begin_layout Subsection +Highest Order Bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Highest Order Bit +\end_layout + +\end_inset + + / Any Order Bit +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Any Order Bit +\end_layout + +\end_inset + + +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +unsigned int gint; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +foo () { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +unsigned char hob1, aob1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +bit hob2, hob3, aob2, aob3; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +hob1 = (gint >> 15) & 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +hob2 = (gint >> 15) & 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +hob3 = gint & 0x8000; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +aob1 = (gint >> 9) & 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +aob2 = (gint >> 8) & 1; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +aob3 = gint & 0x0800; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +will generate the following code: +\end_layout + +\begin_layout Verse + +\family typewriter +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 61 ; +\begin_inset space ~ +\end_inset + + hob.c 7 +\begin_inset Newline newline +\end_inset + +000A E5*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 62 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,(_gint + 1) +\begin_inset Newline newline +\end_inset + +000C 23 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 63 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + rl +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a +\begin_inset Newline newline +\end_inset + +000D 54 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 64 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + anl +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,#0x01 +\begin_inset Newline newline +\end_inset + +000F F5*02 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 65 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_hob1_1_1,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 66 ; +\begin_inset space ~ +\end_inset + + hob.c 8 +\begin_inset Newline newline +\end_inset + +0011 E5*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 67 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,(_gint + 1) +\begin_inset Newline newline +\end_inset + +0013 33 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 68 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + rlc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a +\begin_inset Newline newline +\end_inset + +0014 92*00 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 69 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_hob2_1_1,c +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 66 ; +\begin_inset space ~ +\end_inset + + hob.c 9 +\begin_inset Newline newline +\end_inset + +0016 E5*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 67 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,(_gint + 1) +\begin_inset Newline newline +\end_inset + +0018 33 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 68 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + rlc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a +\begin_inset Newline newline +\end_inset + +0019 92*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 69 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_hob3_1_1,c +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 70 ; +\begin_inset space ~ +\end_inset + + hob.c 10 +\begin_inset Newline newline +\end_inset + +001B E5*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 71 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,(_gint + 1) +\begin_inset Newline newline +\end_inset + +001D 03 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 72 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + rr +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a +\begin_inset Newline newline +\end_inset + +001E 54 01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 73 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + anl +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,#0x01 +\begin_inset Newline newline +\end_inset + +0020 F5*03 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 74 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_aob1_1_1,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 75 ; +\begin_inset space ~ +\end_inset + + hob.c 11 +\begin_inset Newline newline +\end_inset + +0022 E5*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 76 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,(_gint + 1) +\begin_inset Newline newline +\end_inset + +0024 13 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 77 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + rrc +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a +\begin_inset Newline newline +\end_inset + +0025 92*02 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 78 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_aob2_1_1,c +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 79 ; +\begin_inset space ~ +\end_inset + + hob.c 12 +\begin_inset Newline newline +\end_inset + +0027 E5*01 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 80 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + a,(_gint + 1) +\begin_inset Newline newline +\end_inset + +0029 A2 E3 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 81 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + c,acc[3] +\begin_inset Newline newline +\end_inset + +002B 92*03 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 82 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_aob3_1_1,c +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +xyz = gint + ((gint >> 15) & 1); +\end_layout + +\begin_layout Standard +will still be recognized. +\end_layout + +\begin_layout Subsection +Higher Order Byte +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Higher Order Byte +\end_layout + +\end_inset + + / Higher Order Word +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Higher Order Word +\end_layout + +\end_inset + + +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +unsigned int gint; +\begin_inset Newline newline +\end_inset + +unsigned long int glong; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +foo () { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +unsigned char hob1, hob2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +unsigned int how1, how2; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +hob1 = (gint >> 8) & 0xFF; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +hob2 = glong >> 24; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +how1 = (glong >> 16) & 0xFFFF; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +how2 = glong >> 8; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +... +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +will generate the following code: +\end_layout + +\begin_layout Verse + +\family typewriter +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 91 ; +\begin_inset space ~ +\end_inset + + hob.c 15 +\begin_inset Newline newline +\end_inset + +0037 85*01*06 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 92 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_hob1_1_1,(_gint + 1) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 93 ; +\begin_inset space ~ +\end_inset + + hob.c 16 +\begin_inset Newline newline +\end_inset + +003A 85*05*07 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 94 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_hob2_1_1,(_glong + 3) +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 95 ; +\begin_inset space ~ +\end_inset + + hob.c 17 +\begin_inset Newline newline +\end_inset + +003D 85*04*08 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 96 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_how1_1_1,(_glong + 2) +\begin_inset Newline newline +\end_inset + +0040 85*05*09 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 97 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + (_foo_how1_1_1 + 1),(_glong + 3) +\begin_inset Newline newline +\end_inset + +0043 85*03*0A +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 98 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + _foo_how2_1_1,(_glong + 1) +\begin_inset Newline newline +\end_inset + +0046 85*04*0B +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + 99 +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + mov +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + (_foo_how2_1_1 + 1),(_glong + 2) +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +xyz = gint + ((gint >> 8) & 0xFF); +\end_layout + +\begin_layout Standard +will still be recognized. +\end_layout + +\begin_layout Subsection +Placement of Bank-Selection Instructions +\end_layout + +\begin_layout Standard +For non-intrinsic named address spaces, SDCC will place the bank selection + instructions optimally. + For details see Philipp Klaus Krause, +\begin_inset Quotes sld +\end_inset + +Optimal Placement of Bank Selection Instructions in Polynomial Time +\begin_inset Quotes srd +\end_inset + +, Proceedings of the 16th International Workshop on Software and Compilers + for Embedded Systems, M-SCOPES ’13, pp 23–30. + Association for Computing Machinery, 2013. + +\end_layout + +\begin_layout Subsection +Lifetime-Optimal Speculative Partial Redundancy Elimination +\end_layout + +\begin_layout Standard +SDCC has an implementation of lifetime-optimal speculative partial redundancy + elimination based on tree-decompositions. +\end_layout + +\begin_layout Subsection +Register Allocation +\begin_inset CommandInset label +LatexCommand label +name "subsec:Register-Allocation" + +\end_inset + + +\begin_inset Index idx +status open + +\begin_layout Plain Layout +Register-Allocation +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +SDCC currently has two register allocators. + One of them is optimal when optimizing for code size. + This register allocator is used by default on the hc08, s08, z80, z180, + r2k, r3ka, gbz80 and stm8 ports. + Even though it runs in polynomial time, it can be quite slow; therefore + the +\begin_inset Flex Code +status open + +\begin_layout Plain Layout +--max-allocs-per-node +\end_layout + +\end_inset + + command line option can be used for a trade-off between compilation speed + and quality of the generated code: Lower values result in faster compilation, + higher values can result in better code being generated. +\end_layout + +\begin_layout Standard +It first creates a tree-decomposition of the control-flow graph, and then + uses dynamic programming bottom-up along the tree-decomposition. + Optimality is achieved through the use of a cost function, which gives + cost for instructions under register assignments. + The cost function is target-specific and has to be implemented for each + port; in all current SDCC ports the cost function is integrated into code + generation. +\end_layout + +\begin_layout Standard +For more details on how this register allocator works, see: Philipp Klaus + Krause, +\begin_inset Quotes sld +\end_inset + +Optimal Register Allocation in Polynomial Time +\begin_inset Quotes srd +\end_inset + +, Compiler Construction - 22nd International Conference, CC 2013, Held as + Part of the European Joint Conferences on Theory and Practice of Software, + ETAPS 2013. + Proceedings, Lecture Notes in Computer Science, volume 7791, pp. + 1-20. + Springer, 2013. + Also: Philipp Klaus Krause, +\begin_inset Quotes sld +\end_inset + +Bytewise Register Allocation +\begin_inset Quotes srd +\end_inset + +, Proceedings of the 18th International Workshop on Software and Compilers + for Embedded Systems, SCOPES ’15, pp 22–27. + Association for Computing Machinery, 2015. + +\end_layout + +\begin_layout Subsection +Peephole Optimizer +\begin_inset CommandInset label +LatexCommand label +name "subsec:Peephole-Optimizer" + +\end_inset + + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Peephole optimizer +\end_layout + +\end_inset + + +\end_layout + +\begin_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 +\begin_inset space ~ +\end_inset + +@ +\begin_inset space ~ +\end_inset + +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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-file +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-file +\end_layout + +\end_inset + + <filename> +\emph default + option. + The rule language is best illustrated with examples. +\end_layout + +\begin_layout Verse + +\family typewriter +replace { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov %1,a +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,%1 +\begin_inset Newline newline +\end_inset + +} by { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov %1,a +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_layout Standard +The above rule will change the following assembly +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Assembler routines +\end_layout + +\end_inset + + sequence: +\end_layout + +\begin_layout Verse + +\family typewriter +mov r1,a +\begin_inset Newline newline +\end_inset + +mov a,r1 +\end_layout + +\begin_layout Standard +to +\end_layout + +\begin_layout Verse + +\family typewriter +mov r1,a +\end_layout + +\begin_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: +\end_layout + +\begin_layout Verse + +\family typewriter +mov r1,a +\begin_inset Newline newline +\end_inset + +mov a,r2 +\end_layout + +\begin_layout Standard +will remain unmodified. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Other special case optimizations may be added by the user (via +\emph on +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-file option +\emph default +). + E.g. + some variants of the 8051 MCU +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +MCS51 variants +\end_layout + +\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 +\end_layout + +\begin_layout Verse + +\family typewriter +replace { lcall %1 } by { acall %1 } +\begin_inset Newline newline +\end_inset + +replace { ljmp %1 } by { ajmp %1 } +\end_layout + +\begin_layout Standard +(NOTE: from version 2.7.3 on, you can use option - +\emph on + +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + + +\emph default +-acall-ajmp +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-acall-ajmp +\end_layout + +\end_inset + +, which also takes care of aligning the interrupt vectors properly.) +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_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. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The syntax for a rule is as follows: +\end_layout + +\begin_layout Verse + +\family typewriter +rule := replace [ restart ] '{' <assembly sequence> ' +\backslash +n' +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + '}' by '{' ' +\backslash +n' +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + <assembly sequence> ' +\backslash +n' +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + '}' [if <functionName> ] ' +\backslash +n' +\end_layout + +\begin_layout Standard +<assembly sequence> := assembly instruction (each instruction including + labels must be on a separate line). +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +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: +\end_layout + +\begin_layout Verse + +\family typewriter +replace restart { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +pop %1 +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +push %1 } by { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +; nop +\begin_inset Newline newline +\end_inset + +} +\end_layout + +\begin_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.: +\end_layout + +\begin_layout Verse + +\family typewriter +pop ar1 +\begin_inset Newline newline +\end_inset + +pop ar2 +\begin_inset Newline newline +\end_inset + +push ar2 +\begin_inset Newline newline +\end_inset + +push ar1 +\end_layout + +\begin_layout Standard +would result in: +\end_layout + +\begin_layout Verse + +\family typewriter +pop ar1 +\begin_inset Newline newline +\end_inset + +; nop +\begin_inset Newline newline +\end_inset + +push ar1 +\end_layout + +\begin_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: +\end_layout + +\begin_layout Verse + +\family typewriter +; nop +\begin_inset Newline newline +\end_inset + +; nop +\end_layout + +\begin_layout Standard +A conditional function can be attached to a rule. + Attaching rules are somewhat more involved, let's illustrate this with + an example. +\end_layout + +\begin_layout Verse + +\family typewriter +replace { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ljmp %5 +\begin_inset Newline newline +\end_inset + +%2: +\begin_inset Newline newline +\end_inset + +} by { +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sjmp %5 +\begin_inset Newline newline +\end_inset + +%2: +\begin_inset Newline newline +\end_inset + +} if labelInRange +\end_layout + +\begin_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 some of 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, labelRefCountChange, labelIsReturnOnly, xramMovcOpt +ion, portIsDS390, 24bitMode, notVolatile +\emph default +. + +\emph on +notUsed, notSame, operandsNotRelated, labelJTInRange, canAssign, optimizeReturn, + notUsedFrom, labelIsReturnOnly, operandsLiteral, labelIsUncondJump, deadMove, + useAcallAjmp +\emph default + and +\emph on +okToRemoveSLOC. +\end_layout + +\begin_layout Standard +This whole thing is a little kludgy, but maybe some day SDCC will have some + better means. + If you are looking at the +\family typewriter +peeph*.def +\family default + files, 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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-peep-file option. +\end_layout + +\begin_layout Section +Cyclomatic Complexity +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Cyclomatic complexity +\end_layout + +\end_inset + + +\end_layout + +\begin_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. + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +SDCC uses the following formula to compute the complexity: +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +complexity = (number of edges in control flow graph) - (number of nodes + in control flow graph) + 2; +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +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. +\end_layout + +\begin_layout Section +Retargetting for other Processors +\end_layout + +\begin_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 phases of the compiler + and its MCU dependency. +\end_layout + +\begin_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. +\end_layout + +\begin_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 + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +-dumpraw option. +\end_layout + +\begin_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: +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Break down intermediate code (iCode) into basic blocks. +\begin_inset Newline newline +\end_inset + +Do control flow & data flow analysis on the basic blocks. +\begin_inset Newline newline +\end_inset + +Do local common subexpression elimination, then global subexpression elimination +\begin_inset Newline newline +\end_inset + +Dead code elimination +\begin_inset Newline newline +\end_inset + +Loop optimizations +\begin_inset Newline newline +\end_inset + +If loop optimizations caused any changes then do 'global subexpression eliminati +on' and 'dead code elimination' again. +\end_layout + +\begin_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 Index idx +status collapsed + +\begin_layout Plain Layout +Live range analysis +\end_layout + +\end_inset + + is essential for register allocation, since these computation determines + which of these iTemps will be assigned to registers, and for how long. +\end_layout + +\begin_layout Itemize +Phase five is register allocation. + For new ports register allocator described above in +\begin_inset CommandInset ref +LatexCommand ref +reference "subsec:Register-Allocation" + +\end_inset + + should be used in most cases, since it can result in substantially better + code. + In the old register allocator, there are two parts to register allocation. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +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. +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The second part is more MCU independent and deals with allocating registers + to the remaining live ranges. + A lot of MCU specific code does creep into this phase because of the limited + number of index registers available in the 8051. +\end_layout + +\begin_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. +\end_layout + +\begin_layout Itemize +As mentioned in the optimization section the peep-hole optimizer is rule + based system, which can reprogrammed for other MCUs. +\end_layout + +\begin_layout Standard +More information is available on SDCC Wiki +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +wiki +\end_layout + +\end_inset + + (preliminary link +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/wiki/index.php/SDCC_internals_and_porting +\end_layout + +\end_inset + +) and in the thread +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/mailarchive/message.php?msg_id=13954144 +\end_layout + +\end_inset + + . +\end_layout + +\begin_layout Chapter +Compiler internals +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Compiler internals +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Section +The anatomy of the compiler +\begin_inset CommandInset label +LatexCommand label +name "subsec:The-anatomy-of" + +\end_inset + + +\end_layout + +\begin_layout Standard + +\shape italic +This is an excerpt from an article published in Circuit Cellar Magazine + in +\shape default + +\series bold +\shape italic +August 2000 +\series default +. + It's outdated (the compiler is much more efficient now and user/developer + friendly), but pretty well exposes the guts of it all. +\shape default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +The current version of SDCC can generate code for Intel 8051 and Z80 MCU. + It is fairly easy to retarget for other 8-bit MCU. + Here we take a look at some of the internals of the compiler. + +\end_layout + +\begin_layout Paragraph* +Parsing +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Parsing +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Parsing the input source file and creating an AST (Annotated Syntax Tree +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Annotated syntax tree +\end_layout + +\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 intrinsic named address spaces are MCU specific: While + there may be an __xdata intrinsic named address space for 8051 there none + for z80. + SDCC has MCU specific intrinsic named address spacess, i.e. + __xdata will be treated as a named address space when parsing 8051 C code + but will be treated as a C identifier when parsing z80 code. +\end_layout + +\begin_layout Paragraph* +Generating iCode +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +iCode +\end_layout + +\end_inset + + +\end_layout + +\begin_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. +\end_layout + +\begin_layout Paragraph* +Optimizations +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Optimizations +\end_layout + +\end_inset + +. +\end_layout + +\begin_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. +\end_layout + +\begin_layout Paragraph* +Live range analysis +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Live range analysis +\end_layout + +\end_inset + + +\end_layout + +\begin_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. +\end_layout + +\begin_layout Paragraph* +Register Allocation +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Register allocation +\end_layout + +\end_inset + + +\end_layout + +\begin_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. + +\end_layout + +\begin_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. +\end_layout + +\begin_layout Paragraph* +Code generation +\end_layout + +\begin_layout Standard +Figure II gives a table of iCode +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +iCode +\end_layout + +\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. + +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard + +\size footnotesize +Figure II +\begin_inset Tabular +<lyxtabular version="3" rows="39" columns="4"> +<features islongtable="true" headBottomDL="true" longtabularalignment="center"> +<column alignment="block" valignment="top" width="13col%"> +<column alignment="left" valignment="top" width="13col%"> +<column alignment="block" valignment="top" width="22col%"> +<column alignment="block" valignment="top" width="40col%"> +<row endhead="true"> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +iCode +\series default + +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +iCode +\end_layout + +\end_inset + + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Operands +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +Description +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\series bold +C Equivalent +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'!' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +NOT operation +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = ! IC_LEFT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'~' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Bitwise complement of +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = ~IC_LEFT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +RRC +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Rotate right with carry +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = (IC_LEFT << 1) | (IC_LEFT >> (sizeof(IC_LEFT)*8-1)); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +RLC +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Rotate left with carry +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = (IC_LEFT << (sizeof(LC_LEFT)*8-1) ) | (IC_LEFT >> 1); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +GETHBIT +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Get the highest order bit of IC_LEFT +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = (IC_LEFT >> (sizeof(IC_LEFT)*8 -1)); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +UNARYMINUS +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Unary minus +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = - IC_LEFT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IPUSH +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Push the operand into stack +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +NONE +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IPOP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Pop the operand from the stack +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +NONE +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +CALL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Call the function represented by IC_LEFT +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT(); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +PCALL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Call via function pointer +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = (*IC_LEFT)(); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +RETURN +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Return the value in operand IC_LEFT +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +return IC_LEFT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +LABEL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LABEL() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Label +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LABEL: +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +GOTO +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LABEL() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Goto label +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +goto IC_LABEL(); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'+' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Addition +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT + IC_RIGHT +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'-' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Subtraction +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT - IC_RIGHT +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'*' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Multiplication +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT * IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'/' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Division +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT / IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'%' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Modulus +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT % IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'<' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Less than +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT < IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'>' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Greater than +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT > IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +EQ_OP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Equal to +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT == IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +AND_OP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Logical and operation +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT && IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +OR_OP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Logical or operation +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT || IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'^' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Exclusive OR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT ^ IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'|' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Bitwise OR +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT | IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +BITWISEAND +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Bitwise AND +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT & IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +LEFT_OP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Left shift +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT << IC_RIGHT +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +RIGHT_OP +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Right shift +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_LEFT >> IC_RIGHT +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +GET_VALUE_ +\begin_inset Newline newline +\end_inset + +AT_ ADDRESS +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Indirect fetch +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = (*IC_LEFT); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +POINTER_SET +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Indirect set +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +(*IC_RESULT) = IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +'=' +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RIGHT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Assignment +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IFX +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_COND IC_TRUE IC_LABEL +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\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_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +if (IC_COND) goto IC_TRUE; +\begin_inset Newline newline +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +Or +\begin_inset Newline newline +\end_inset + +If (!IC_COND) goto IC_FALSE; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +ADDRESS_OF +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Address of +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = &IC_LEFT(); +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +JUMPTABLE +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_JTCOND IC_JTLABELS +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Jump to list of labels depending on the value of JTCOND +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Switch statement +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +CAST +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RIGHT() IC_LEFT() IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +Cast types +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT = (typeof IC_LEFT) IC_RIGHT; +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +SEND +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_LEFT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +This is used for passing parameters in registers; +\begin_inset Newline newline +\end_inset + +move IC_LEFT to the next available parameter register. +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +None +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +RECV +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +IC_RESULT() +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +This is used for receiving parameters passed in registers; +\begin_inset Newline newline +\end_inset + +Move the values in the next parameter register to IC_RESULT +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\size footnotesize +None +\end_layout + +\end_inset +</cell> +</row> +<row> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\shape slanted +\size footnotesize +(some more have been added) +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\end_layout + +\end_inset +</cell> +<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none"> +\begin_inset Text + +\begin_layout Plain Layout + +\shape slanted +\size footnotesize +see f.e. + +\shape default + +\family typewriter +\shape slanted +gen51Code() +\family default +\shape default + +\shape slanted +in +\shape default + +\family typewriter +\shape slanted +src/mcs51/gen.c +\end_layout + +\end_inset +</cell> +</row> +</lyxtabular> + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status collapsed + +\begin_layout Plain Layout +In the original article Figure II was announced to be downloadable on +\shape italic +Circuit Cellar +\shape default +'s web site. + ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2000/121/dutta.ZIP +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Paragraph* +ICode Example +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +iCode +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +This section shows some details of iCode. + The example C code does not do anything useful; it is used as an example + to illustrate the intermediate code generated by the compiler. +\end_layout + +\begin_layout Verse + +\family typewriter +1. +\begin_inset space ~ +\end_inset + +__xdata int * p; +\begin_inset Newline newline +\end_inset + +2. +\begin_inset space ~ +\end_inset + +int gint; +\begin_inset Newline newline +\end_inset + +3. +\begin_inset space ~ +\end_inset + +/* This function does nothing useful. + It is used +\begin_inset Newline newline +\end_inset + +4. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +for the purpose of explaining iCode */ +\begin_inset Newline newline +\end_inset + +5. +\begin_inset space ~ +\end_inset + +short function (__data int *x) +\begin_inset Newline newline +\end_inset + +6. +\begin_inset space ~ +\end_inset + +{ +\begin_inset Newline newline +\end_inset + +7. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +short i=10; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* dead initialization eliminated */ +\begin_inset Newline newline +\end_inset + +8. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +short sum=10; /* dead initialization eliminated */ +\begin_inset Newline newline +\end_inset + +9. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +short mul; +\begin_inset Newline newline +\end_inset + +10. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +int j ; +\begin_inset Newline newline +\end_inset + +11. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +while (*x) *x++ = *p++; +\begin_inset Newline newline +\end_inset + +12. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sum = 0 ; +\begin_inset Newline newline +\end_inset + +13. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mul = 0; +\begin_inset Newline newline +\end_inset + +14. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* compiler detects i,j to be induction variables */ +\begin_inset Newline newline +\end_inset + +15. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +for (i = 0, j = 10 ; i < 10 ; i++, j +\family default +- +\begin_inset ERT +status collapsed + +\begin_layout Plain Layout + + +\backslash +/ +\end_layout + +\end_inset + +- +\family typewriter +) { +\begin_inset Newline newline +\end_inset + +16. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sum += i; +\begin_inset Newline newline +\end_inset + +17. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mul += i * 3; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* this multiplication remains */ +\begin_inset Newline newline +\end_inset + +18. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +gint += j * 3; +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +/* this multiplication changed to addition */ +\begin_inset Newline newline +\end_inset + +19. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +} +\begin_inset Newline newline +\end_inset + +20. +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +return sum+mul; +\begin_inset Newline newline +\end_inset + +21. +\begin_inset space ~ +\end_inset + +} +\end_layout + +\begin_layout Standard +In addition to the operands each iCode contains information about the filename + and line it corresponds to in the source file. + The first field in the listing should be interpreted as follows: +\begin_inset Newline newline +\end_inset + + +\shape italic +\size footnotesize +Filename(linenumber: iCode Execution sequence number : ICode hash table + key : loop depth of the iCode). +\shape default +\size default + +\begin_inset Newline newline +\end_inset + +Then follows the human readable form of the ICode operation. + Each operand of this triplet form can be of three basic types a) compiler + generated temporary b) user defined variable c) a constant value. + Note that local variables and parameters are replaced by compiler generated + temporaries. + Live ranges +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Live range analysis +\end_layout + +\end_inset + + are computed only for temporaries (i.e. + live ranges are not computed for global variables). + Registers +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Register allocation +\end_layout + +\end_inset + + are allocated for temporaries only. + Operands are formatted in the following manner: +\begin_inset Newline newline +\end_inset + + +\shape italic +\size footnotesize +Operand Name [lr live-from : live-to ] { type information } [ registers + allocated ]. +\shape default +\size default + +\begin_inset Newline newline +\end_inset + +As mentioned earlier the live ranges are computed in terms of the execution + sequence number of the iCodes, for example +\begin_inset Newline newline +\end_inset + +the iTemp0 is live from (i.e. + first defined in iCode with execution sequence number 3, and is last used + in the iCode with sequence number 5). + For induction variables such as iTemp21 the live range computation extends + the lifetime from the start to the end of the loop. +\begin_inset Newline newline +\end_inset + +The register allocator used the live range information to allocate registers, + the same registers may be used for different temporaries if their live + ranges do not overlap, for example r0 is allocated to both iTemp6 and to + iTemp17 since their live ranges do not overlap. + In addition the allocator also takes into consideration the type and usage + of a temporary, for example itemp6 is a pointer to near space and is used + as to fetch data from (i.e. + used in GET_VALUE_AT_ADDRESS) so it is allocated a pointer register (r0). + Some short lived temporaries are allocated to special registers which have + meaning to the code generator e.g. + iTemp13 is allocated to a pseudo register CC which tells the back end that + the temporary is used only for a conditional jump the code generation makes + use of this information to optimize a compare and jump ICode. +\begin_inset Newline newline +\end_inset + +There are several loop optimizations +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Loop optimization +\end_layout + +\end_inset + + performed by the compiler. + It can detect induction variables iTemp21(i) and iTemp23(j). + Also note the compiler does selective strength reduction +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Strength reduction +\end_layout + +\end_inset + +, i.e. + the multiplication of an induction variable in line 18 (gint = j * 3) is + changed to addition, a new temporary iTemp17 is allocated and assigned + a initial value, a constant 3 is then added for each iteration of the loop. + The compiler does not change the multiplication +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Multiplication +\end_layout + +\end_inset + + in line 17 however since the processor does support an 8 * 8 bit multiplication. +\begin_inset Newline newline +\end_inset + +Note the dead code elimination +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Dead-code elimination +\end_layout + +\end_inset + + optimization eliminated the dead assignments in line 7 & 8 to I and sum + respectively. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c (5:1:0:0) _entry($9) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(5:2:1:0) proc _function [lr0:0]{function short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:3:2:0) iTemp0 [lr3:5]{_near * int}[r2] = recv +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:4:53:0) preHeaderLbl0($11) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:5:55:0) iTemp6 [lr5:16]{_near * int}[r0] := iTemp0 [lr3:5]{_near + * int}[r2] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:6:5:1) _whilecontinue_0($1) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:7:7:1) iTemp4 [lr7:8]{int}[r2 r3] = @[iTemp6 [lr5:16]{_near * + int}[r0]] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:8:8:1) if iTemp4 [lr7:8]{int}[r2 r3] == 0 goto _whilebreak_0($3) +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:9:14:1) iTemp7 [lr9:13]{_far * int}[DPTR] := _p [lr0:0]{_far + * int} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:10:15:1) _p [lr0:0]{_far * int} = _p [lr0:0]{_far * int} + 0x2 + {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:13:18:1) iTemp10 [lr13:14]{int}[r2 r3] = @[iTemp7 [lr9:13]{_far + * int}[DPTR]] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:14:19:1) *(iTemp6 [lr5:16]{_near * int}[r0]) := iTemp10 [lr13:14]{int +}[r2 r3] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:15:12:1) iTemp6 [lr5:16]{_near * int}[r0] = iTemp6 [lr5:16]{_near + * int}[r0] + 0x2 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:16:20:1) goto _whilecontinue_0($1) +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(11:17:21:0)_whilebreak_0($3) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(12:18:22:0) iTemp2 [lr18:40]{short}[r2] := 0x0 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(13:19:23:0) iTemp11 [lr19:40]{short}[r3] := 0x0 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:20:54:0)preHeaderLbl1($13) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:21:56:0) iTemp21 [lr21:38]{short}[r4] := 0x0 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:22:57:0) iTemp23 [lr22:38]{int}[r5 r6] := 0xa {int} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:23:58:0) iTemp17 [lr23:38]{int}[r7 r0] := 0x1e {int} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:24:26:1)_forcond_0($4) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:25:27:1) iTemp13 [lr25:26]{char}[CC] = iTemp21 [lr21:38]{short}[r4] + < 0xa {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:26:28:1) if iTemp13 [lr25:26]{char}[CC] == 0 goto _forbreak_0($7) +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(16:27:31:1) iTemp2 [lr18:40]{short}[r2] = iTemp2 [lr18:40]{short}[r2] + + ITemp21 [lr21:38]{short}[r4] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(17:29:33:1) iTemp15 [lr29:30]{short}[r1] = iTemp21 [lr21:38]{short}[r4] + * 0x3 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(17:30:34:1) iTemp11 [lr19:40]{short}[r3] = iTemp11 [lr19:40]{short}[r3] + + iTemp15 [lr29:30]{short}[r1] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(18:32:36:1:1) iTemp17 [lr23:38]{int}[r7 r0]= iTemp17 [lr23:38]{int}[r7 + r0]- 0x3 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(18:33:37:1) _gint [lr0:0]{int} = _gint [lr0:0]{int} + iTemp17 [lr23:38]{ +int}[r7 r0] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:36:42:1) iTemp21 [lr21:38]{short}[r4] = iTemp21 [lr21:38]{short}[r4] + + 0x1 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(15:37:45:1) iTemp23 [lr22:38]{int}[r5 r6]= iTemp23 [lr22:38]{int}[r5 + r6]- 0x1 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(19:38:47:1) goto _forcond_0($4) +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(19:39:48:0)_forbreak_0($7) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(20:40:49:0) iTemp24 [lr40:41]{short}[DPTR] = iTemp2 [lr18:40]{short}[r2] + + ITemp11 [lr19:40]{short}[r3] +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(20:41:50:0) ret iTemp24 [lr40:41]{short} +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(20:42:51:0)_return($8) : +\end_layout + +\begin_layout Standard + +\size footnotesize +Sample.c(20:43:52:0) eproc _function [lr0:0]{ ia0 re0 rm0}{function short} +\size default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + +Finally the code generated for this function: +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard + +\size footnotesize +.area DSEG (DATA) +\end_layout + +\begin_layout Standard + +\size footnotesize +_p:: +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.ds 2 +\end_layout + +\begin_layout Standard + +\size footnotesize +_gint:: +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +.ds 2 +\end_layout + +\begin_layout Standard + +\size footnotesize +; sample.c 5 +\end_layout + +\begin_layout Standard + +\size footnotesize +; ———————————————- +\end_layout + +\begin_layout Standard + +\size footnotesize +; function function +\end_layout + +\begin_layout Standard + +\size footnotesize +; ———————————————- +\end_layout + +\begin_layout Standard + +\size footnotesize +_function: +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp0 [lr3:5]{_near * int}[r2] = recv +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r2,dpl +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp6 [lr5:16]{_near * int}[r0] := iTemp0 [lr3:5]{_near * int}[r2] +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov ar0,r2 +\end_layout + +\begin_layout Standard + +\size footnotesize +;_whilecontinue_0($1) : +\end_layout + +\begin_layout Standard + +\size footnotesize +00101$: +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp4 [lr7:8]{int}[r2 r3] = @[iTemp6 [lr5:16]{_near * int}[r0]] +\end_layout + +\begin_layout Standard + +\size footnotesize +; if iTemp4 [lr7:8]{int}[r2 r3] == 0 goto _whilebreak_0($3) +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov ar2,@r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov ar3,@r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dec r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r2 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +orl a,r3 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jz 00103$ +\end_layout + +\begin_layout Standard + +\size footnotesize +00114$: +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp7 [lr9:13]{_far * int}[DPTR] := _p [lr0:0]{_far * int} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dpl,_p +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dph,(_p + 1) +\end_layout + +\begin_layout Standard + +\size footnotesize +; _p [lr0:0]{_far * int} = _p [lr0:0]{_far * int} + 0x2 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,#0x02 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add a,_p +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov _p,a +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +clr a +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +addc a,(_p + 1) +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov (_p + 1),a +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp10 [lr13:14]{int}[r2 r3] = @[iTemp7 [lr9:13]{_far * int}[DPTR]] +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx a,@dptr +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r2,a +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc dptr +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +movx a,@dptr +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r3,a +\end_layout + +\begin_layout Standard + +\size footnotesize +; *(iTemp6 [lr5:16]{_near * int}[r0]) := iTemp10 [lr13:14]{int}[r2 r3] +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov @r0,ar2 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov @r0,ar3 +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp6 [lr5:16]{_near * int}[r0] = +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp6 [lr5:16]{_near * int}[r0] + +\end_layout + +\begin_layout Standard + +\size footnotesize +; 0x2 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +; goto _whilecontinue_0($1) +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sjmp 00101$ +\end_layout + +\begin_layout Standard + +\size footnotesize +; _whilebreak_0($3) : +\end_layout + +\begin_layout Standard + +\size footnotesize +00103$: +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp2 [lr18:40]{short}[r2] := 0x0 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r2,#0x00 +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp11 [lr19:40]{short}[r3] := 0x0 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r3,#0x00 +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp21 [lr21:38]{short}[r4] := 0x0 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r4,#0x00 +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp23 [lr22:38]{int}[r5 r6] := 0xa {int} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r5,#0x0A +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r6,#0x00 +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp17 [lr23:38]{int}[r7 r0] := 0x1e {int} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r7,#0x1E +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,#0x00 +\end_layout + +\begin_layout Standard + +\size footnotesize +; _forcond_0($4) : +\end_layout + +\begin_layout Standard + +\size footnotesize +00104$: +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp13 [lr25:26]{char}[CC] = iTemp21 [lr21:38]{short}[r4] < 0xa {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +; if iTemp13 [lr25:26]{char}[CC] == 0 goto _forbreak_0($7) +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +clr c +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r4 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +xrl a,#0x80 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +subb a,#0x8a +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +jnc 00107$ +\end_layout + +\begin_layout Standard + +\size footnotesize +00115$: +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp2 [lr18:40]{short}[r2] = iTemp2 [lr18:40]{short}[r2] + +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp21 [lr21:38]{short}[r4] +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r4 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add a,r2 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r2,a +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp15 [lr29:30]{short}[r1] = iTemp21 [lr21:38]{short}[r4] * 0x3 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov b,#0x03 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r4 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mul ab +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r1,a +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp11 [lr19:40]{short}[r3] = iTemp11 [lr19:40]{short}[r3] + +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp15 [lr29:30]{short}[r1] +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add a,r3 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r3,a +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp17 [lr23:38]{int}[r7 r0]= iTemp17 [lr23:38]{int}[r7 r0]- 0x3 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r7 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add a,#0xfd +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r7,a +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +addc a,#0xff +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov r0,a +\end_layout + +\begin_layout Standard + +\size footnotesize +; _gint [lr0:0]{int} = _gint [lr0:0]{int} + iTemp17 [lr23:38]{int}[r7 r0] +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r7 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add a,_gint +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov _gint,a +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r0 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +addc a,(_gint + 1) +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov (_gint + 1),a +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp21 [lr21:38]{short}[r4] = iTemp21 [lr21:38]{short}[r4] + 0x1 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +inc r4 +\end_layout + +\begin_layout Standard + +\size footnotesize +; iTemp23 [lr22:38]{int}[r5 r6]= iTemp23 [lr22:38]{int}[r5 r6]- 0x1 {short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dec r5 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +cjne r5,#0xff,00104$ +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +dec r6 +\end_layout + +\begin_layout Standard + +\size footnotesize +; goto _forcond_0($4) +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +sjmp 00104$ +\end_layout + +\begin_layout Standard + +\size footnotesize +; _forbreak_0($7) : +\end_layout + +\begin_layout Standard + +\size footnotesize +00107$: +\end_layout + +\begin_layout Standard + +\size footnotesize +; ret iTemp24 [lr40:41]{short} +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov a,r3 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +add a,r2 +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +mov dpl,a +\end_layout + +\begin_layout Standard + +\size footnotesize +; _return($8) : +\end_layout + +\begin_layout Standard + +\size footnotesize +00108$: +\end_layout + +\begin_layout Standard + +\size footnotesize +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +ret +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Section +A few words about basic block successors, predecessors and dominators +\end_layout + +\begin_layout Standard +Successors are basic blocks +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Basic blocks +\end_layout + +\end_inset + + that might execute after this basic block. +\begin_inset Newline newline +\end_inset + +Predecessors are basic blocks that might execute before reaching this basic + block. +\begin_inset Newline newline +\end_inset + +Dominators are basic blocks that WILL execute before reaching this basic + block. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +[basic block 1] +\end_layout + +\begin_layout Standard +if (something) +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +[basic block 2] +\end_layout + +\begin_layout Standard +else +\end_layout + +\begin_layout Standard +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + + +\begin_inset space ~ +\end_inset + +[basic block 3] +\end_layout + +\begin_layout Standard +[basic block 4] +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +a) succList of [BB2] = [BB4], of [BB3] = [BB4], of [BB1] = [BB2,BB3] +\end_layout + +\begin_layout Standard +b) predList of [BB2] = [BB1], of [BB3] = [BB1], of [BB4] = [BB2,BB3] +\end_layout + +\begin_layout Standard +c) domVect of [BB4] = BB1 ... + here we are not sure if BB2 or BB3 was executed but we are SURE that BB1 + was executed. +\end_layout + +\begin_layout Chapter +Acknowledgments +\end_layout + +\begin_layout Standard +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sdcc.sourceforge.net/#Who +\end_layout + +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\emph on +Thanks to all the other volunteer developers who have helped with coding, + testing, web-page creation, distribution sets, etc. + You know who you are :-) +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\emph on +Thanks to Sourceforge +\begin_inset Flex URL +status collapsed + +\begin_layout Plain Layout + +http://sourceforge.net/ +\end_layout + +\end_inset + + which has hosted the project since 1999 and donates significant download + bandwidth. +\emph default + +\begin_inset Newline newline +\end_inset + + +\begin_inset Newline newline +\end_inset + + +\emph on +Also thanks to all SDCC Distributed Compile Farm members for donating CPU + cycles and bandwidth for snapshot builds. +\begin_inset Newline newline +\end_inset + + +\end_layout + +\begin_layout Standard +This document was initially written by Sandeep Dutta and updated by SDCC + developers. +\end_layout + +\begin_layout Standard +All product names mentioned herein may be trademarks +\begin_inset Index idx +status collapsed + +\begin_layout Plain Layout +Trademarks +\end_layout + +\end_inset + + of their respective companies. + +\end_layout + +\begin_layout Section* +Alphabetical index +\end_layout + +\begin_layout Standard +To avoid confusion, the installation and building options for SDCC itself + (chapter 2) are not part of the index. +\end_layout + +\begin_layout Standard +\begin_inset CommandInset index_print +LatexCommand printindex +type "idx" +name "Index" +literal "true" + +\end_inset + + +\end_layout + +\end_body +\end_document |
