+\end_inset
+
+
+\begin_inset LatexCommand index
+name "Pragmas"
+
+\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 LatexCommand vref
+reference "sec:Command-Line-Options"
+
+\end_inset
+
+).
+\newline
+Pragmas should be placed before and/or after a function, placing pragmas
+ inside a function body could have unpredictable results.
+\newline
+
+\newline
+SDCC supports the
+ following #pragma directives:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+save
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma save"
+
+\end_inset
+
+ - this will save most current options to the save/restore stack.
+ See #pragma\InsetSpace ~
+restore.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+restore
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma restore"
+
+\end_inset
+
+ - will restore saved options from the last save.
+ saves & restores can be nested.
+ SDCC uses a save/restore stack: save pushes current options to the stack,
+ restore pulls current options from the stack.
+ See #pragma\InsetSpace ~
+save.
+\newline
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+callee_saves
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma callee\\_saves"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "function prologue"
+
+\end_inset
+
+ function1[,function2[,function3...]]
+\begin_inset 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 LatexCommand index
+name "push/pop"
+
+\end_inset
+
+ when calling small functions from larger functions.
+ This option can be used to switch off the register saving convention for
+ the function names specified.
+ The compiler will not save registers when calling these functions, extra
+ code need to be manually inserted at the entry 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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-callee-saves command line option is used (see page
+\begin_inset LatexCommand vpageref
+reference "lyx:--callee-saves-function1[,function2][,function3]..."
+
+\end_inset
+
+), the function names specified in #pragma\InsetSpace ~
+callee_saves
+\begin_inset LatexCommand index
+name "\\#pragma callee\\_saves"
+
+\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 LatexCommand index
+name "\\#pragma exclude"
+
+\end_inset
+
+ none | {acc[,b[,dpl[,dph]]] - The exclude pragma disables the generation
+ of pairs of push/pop
+\begin_inset LatexCommand index
+name "push/pop"
+
+\end_inset
+
+ instructions in
+\emph on
+I
+\emph default
+nterrupt
+\begin_inset LatexCommand index
+name "interrupt"
+
+\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\InsetSpace ~
+exclude\InsetSpace ~
+none
+\begin_inset LatexCommand index
+name "\\#pragma exclude"
+
+\end_inset
+
+.
+ See also the related keyword _naked
+\begin_inset LatexCommand index
+name "\\_naked"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "\\_\\_naked"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+less_pedantic
+\series default
+
+\begin_inset LatexCommand index
+name "pedantic"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "\\#pragma less\\_pedantic"
+
+\end_inset
+
+
+\begin_inset 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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-less-pedantic
+\begin_inset LatexCommand vpageref
+reference "lyx:--less-pedantic"
+
+\end_inset
+
+.
+
+\newline
+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).
+
+\newline
+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 Standard
+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\InsetSpace ~
+nam
+e]':\InsetSpace ~
+[
+\begin_inset Note Note
+status collapsed
+
+\begin_layout Standard
+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 LatexCommand index
+name "\\#pragma disable\\_warning"
+
+\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 LatexCommand index
+name "\\#pragma nogcse"
+
+\end_inset
+
+ - will stop global common subexpression elimination.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noinduction
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noinduction"
+
+\end_inset
+
+ - will stop loop induction optimizations.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noinvariant
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noinvariant"
+
+\end_inset
+
+ - will not do loop invariant optimizations.
+ For more details see Loop Invariants in section
+\begin_inset LatexCommand ref
+reference "sub:Loop-Optimizations"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noiv
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noiv"
+
+\end_inset
+
+ - Do not generate interrupt
+\begin_inset LatexCommand index
+name "interrupt"
+
+\end_inset
+
+ vector table
+\begin_inset LatexCommand index
+name "interrupt vector table"
+
+\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 interrupt keyword, see section
+\begin_inset LatexCommand ref
+reference "sub:Interrupt-Service-Routines"
+
+\end_inset
+
+\InsetSpace ~
+about interrupts.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+nojtbound
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma nojtbound"
+
+\end_inset
+
+ - will not generate code for boundary value checking, when switch statements
+ are turned into jump-tables (dangerous).
+ For more details see section
+\begin_inset LatexCommand ref
+reference "sub:'switch'-Statements"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+noloopreverse
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma noloopreverse"
+
+\end_inset
+
+ - Will not do loop reversal optimization
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+nooverlay
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma nooverlay"
+
+\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 LatexCommand index
+name "\\#pragma stackauto"
+
+\end_inset
+
+- See option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-stack-auto
+\begin_inset LatexCommand index
+name "-\\/-stack-auto"
+
+\end_inset
+
+ and section
+\begin_inset 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 LatexCommand index
+name "\\#pragma opt\\_code\\_speed"
+
+\end_inset
+
+- The compiler will optimize code generation towards fast code, possibly
+ at the expense of code size.
+ Currently this has little effect.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+opt_code_size
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma opt\\_code\\_size"
+
+\end_inset
+
+- The compiler will optimize code generation towards compact code, possibly
+ at the expense of code speed.
+ Currently this has little effect.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+opt_code_balanced
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma opt\\_code\\_balanced"
+
+\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 LatexCommand index
+name "\\#pragma std\\_sdcc89"
+
+\end_inset
+
+- Generally follow the C89 standard, but allow SDCC features that conflict
+ with the standard (default).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+std_c89
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma std\\_c89"
+
+\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 LatexCommand index
+name "\\#pragma std\\_sdcc99"
+
+\end_inset
+
+- Generally follow the C99 standard, but allow SDCC features that conflict
+ with the standard (incomplete support).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+std_c99
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma std\\_c99"
+
+\end_inset
+
+- Follow the C99 standard and disable SDCC features that conflict with the
+ standard (incomplete support).
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+codeseg
+\series default
+ <name>
+\begin_inset LatexCommand index
+name "\\#pragma codeseg"
+
+\end_inset
+
+- Use this name (max.
+ 8 characters) for the code segment.
+ See option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-codeseg.
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+constseg
+\series default
+ <name>
+\begin_inset LatexCommand index
+name "\\#pragma constseg"
+
+\end_inset
+
+- Use this name (max.
+ 8 characters) for the const segment.
+ See option -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-constseg.
+\end_layout
+
+\begin_layout Standard
+The preprocessor SDCPP
+\begin_inset LatexCommand index
+name "sdcpp (preprocessor)"
+
+\end_inset
+
+ supports the following #pragma directives:
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+pedantic_parse_number
+\series default
+
+\begin_inset LatexCommand index
+name "pedantic"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "\\#pragma pedantic\\_parse\\_number"
+
+\end_inset
+
+ (+ | -)
+\begin_inset 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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-pedantic-parse-number command line option
+\begin_inset LatexCommand vpageref
+reference "lyx:-pedantic-parse-number"
+
+\end_inset
+
+.
+
+\newline
+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 LatexCommand index
+name "\\#pragma pedantic\\_parse\\_number"
+
+\end_inset
+
+
+\newline
+
+\newline
+#define LO_B(x) ((x) & 0xff)
+\newline
+
+\newline
+unsigned char foo(void)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+unsigned char c=0xfe-LO_B(3)
+;
+\newline
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+return c;
+\newline
+}
+\newline
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+preproc_asm
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma preproc\\_asm"
+
+\end_inset
+
+ (+ | -) - switch _asm _endasm block preprocessing on / off.
+ Default is on.
+ You use this pragma to define multilines of assembly code.
+ This will prevent the preprocessor from changing the formatting required
+ by assembly code.
+ Below is an example on how to use this pragma.
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+#pragma preproc_asm -
+\begin_inset LatexCommand index
+name "\\#pragma preproc\\_asm"
+
+\end_inset
+
+
+\newline
+#define MYDELAY _asm
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+nop ;my assembly comment...
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+nop
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+nop
+\newline
+_endasm
+\newline
+#pragma preproc_asm
+ +
+\newline
+
+\newline
+void foo (void)
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ ...
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ MYDELAY;
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+ ...
+
+\newline
+}
+\newline
+
+\end_layout
+
+\begin_layout Itemize
+
+\series bold
+sdcc_hash
+\series default
+
+\begin_inset LatexCommand index
+name "\\#pragma sdcc\\_hash"
+
+\end_inset
+
+ (+ | -) - Allow "naked" hash in macro definition, for example:
+\newline
+
+\family typewriter
+#define DIR_LO(x) #(x & 0xff)
+\family default
+
+\newline
+Default is off.
+ Below is an example on how to use this pragma.
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+#pragma preproc_asm +
+\newline
+#pragma sdcc_hash +
+\begin_inset LatexCommand index
+name "\\#pragma sdcc\\_hash"
+
+\end_inset
+
+
+\newline
+
+\newline
+#define ROMCALL(x)
+\backslash
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov R6_B3, #(x & 0xff)
+\backslash
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mov R7_B3, #((x >> 8) & 0xff)
+\backslash
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+lcall __romcall
+\newline
+
+\newline
+...
+\newline
+_asm
+\newline
+ROMCALL(72)
+\newline
+_endasm;
+\newline
+...
+\newline
+
+\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 LatexCommand index
+name "\\#pragma save"
+
+\end_inset
+
+ \InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* save the current settings */
+\newline
+#pragma nogcse
+\begin_inset LatexCommand index
+name "\\#pragma nogcse"
+
+\end_inset
+
+ \InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+/* turnoff global subexpression elimination */
+\newline
+#pragma noinduction
+\begin_inset LatexCommand index
+name "\\#pragma noinduction"
+
+\end_inset
+
+ /* turn off induction optimizations */
+\newline
+int foo ()
+\newline
+{
+\newline
+\InsetSpace ~
+ \InsetSpace ~
+ ...
+
+\newline
+\InsetSpace ~
+ \InsetSpace ~
+ /* large code */
+\newline
+\InsetSpace ~
+ \InsetSpace ~
+ ...
+
+\newline
+}
+\newline
+#pragma restore
+\begin_inset LatexCommand index
+name "\\#pragma restore"
+
+\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.
+\newline
+
+\newline
+
+\newline
+
+\end_layout
+
+\begin_layout Section
+Defines Created by the Compiler
+\end_layout
+
+\begin_layout Standard
+The compiler creates the following #defines
+\begin_inset LatexCommand index
+name "\\#defines"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "Defines created by the compiler"
+
+\end_inset
+
+:
+\newline
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Tabular
+<lyxtabular version="3" rows="15" columns="2">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="3in">
+<column alignment="left" valignment="top" leftline="true" rightline="true" width="3in">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+#define
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC
+\begin_inset LatexCommand index
+name "SDCC"
+
+\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 Standard
+Always defined.
+ Since version 2.5.6 the version number as an int (ex.
+ 256)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_mcs51
+\begin_inset LatexCommand index
+name "SDCC\\_mcs51"
+
+\end_inset
+
+ or SDCC_ds390
+\begin_inset LatexCommand index
+name "SDCC\\_ds390"
+
+\end_inset
+
+ or SDCC_z80
+\begin_inset LatexCommand index
+name "SDCC\\_z80"
+
+\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 Standard
+depending on the model used (e.g.: -mds390)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+__mcs51
+\begin_inset LatexCommand index
+name "\\_\\_mcs51"
+
+\end_inset
+
+, __ds390
+\begin_inset LatexCommand index
+name "\\_\\_ds390"
+
+\end_inset
+
+, __hc08
+\begin_inset LatexCommand index
+name "\\_\\_hc08"
+
+\end_inset
+
+, __z80
+\begin_inset LatexCommand index
+name "\\_\\_z80"
+
+\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 Standard
+depending on the model used (e.g.
+ -mz80)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_STACK_AUTO
+\begin_inset LatexCommand index
+name "SDCC\\_STACK\\_AUTO"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-stack-auto
+\emph default
+ option is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_SMALL
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_SMALL"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-model-small
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_MEDIUM
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_MEDIUM"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-model-medium
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_LARGE
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_LARGE"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-model-large
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_USE_XSTACK
+\begin_inset LatexCommand index
+name "SDCC\\_USE\\_XSTACK"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-xstack
+\emph default
+ option is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_CHAR_UNSIGNED
+\begin_inset LatexCommand index
+name "SDCC\\_CHAR\\_UNSIGNED"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-funsigned-char
+\emph default
+ option is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_STACK_TENBIT
+\begin_inset LatexCommand index
+name "SDCC\\_STACK\\_TENBIT"
+
+\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 Standard
+when
+\emph on
+-mds390
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_MODEL_FLAT24
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_FLAT24"
+
+\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 Standard
+when
+\emph on
+-mds390
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_REVISION
+\begin_inset LatexCommand index
+name "SDCC\\_REVISION"
+
+\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 Standard
+Always defined.
+ SDCC svn revision number
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_PARMS_IN_BANK1
+\begin_inset LatexCommand index
+name "SDCC\\_PARMS\\_IN\\_BANK1"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-parms-in-bank1
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_FLOAT_REENT
+\begin_inset LatexCommand index
+name "SDCC\\_MODEL\\_FLAT24"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-float-reent
+\emph default
+ is used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_INT_LONG_REENT
+\begin_inset LatexCommand index
+name "SDCC\\_INT\\_LONG\\_REENT"
+
+\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 Standard
+when
+\emph on
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\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 LatexCommand label
+name "sub:MCS51-variants"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "MCS51 variants"
+
+\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 LatexCommand index
+name "P2 (mcs51 sfr)"
+
+\end_inset
+
+ as dedicated I/O port is becoming more popular.
+ Switching the high byte for pdata
+\begin_inset LatexCommand index
+name "pdata (mcs51, ds390 storage class)"
+
+\end_inset
+
+ access which was formerly done by port P2 is then achieved by a Special
+ Function Register
+\begin_inset LatexCommand index
+name "sfr"
+
+\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 LatexCommand index
+name "\\_XPAGE (mcs51)"
+
+\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
+For more exotic implementations further customizations may be needed.
+ See section
+\begin_inset LatexCommand ref
+reference "sub: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 Double DPTR
+\begin_inset LatexCommand index
+name "DPTR"
+
+\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
+\end_layout
+
+\begin_layout Standard
+Bankswitching
+\begin_inset LatexCommand index
+name "Bankswitching"
+
+\end_inset
+
+ (a.k.a.
+ code banking
+\begin_inset LatexCommand index
+name "code banking"
+
+\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>
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell multicolumn="1" alignment="center" valignment="top" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+8000-FFFF
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+bank1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+bank2
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+bank3
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell multicolumn="1" alignment="center" valignment="top" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0000-7FFF
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+common
+\end_layout
+
+\end_inset
+</cell>
+<cell multicolumn="1" alignment="center" valignment="top" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\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 Standard
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row>
+<cell multicolumn="1" alignment="center" valignment="top" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SiLabs C8051F120 example
+\end_layout
+
+\end_inset
+</cell>
+<cell multicolumn="2" alignment="center" valignment="top" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell multicolumn="2" alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\newline
+
+\newline
+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.
+\newline
+
+\newline
+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.
+\newline
+
+\newline
+To create a function
+ that can be called from another bank it requires the keyword
+\emph on
+banked
+\emph default
+
+\begin_inset LatexCommand index
+name "banked"
+
+\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!
+\newline
+
+\newline
+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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-codeseg BANK1 (See
+\begin_inset LatexCommand ref
+reference "lyx:-codeseg"
+
+\end_inset
+
+) on the command line when compiling or #pragma codeseg BANK1 (See
+\begin_inset 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.
+\newline
+
+\newline
+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 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 Standard
+\begin_inset VSpace bigskip
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+DS400 port
+\end_layout
+
+\begin_layout Standard
+The DS80C400
+\begin_inset LatexCommand index
+name "DS80C400"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "DS400"
+
+\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 LatexCommand url
+target "ftp://ftp.dalsemi.com/pub/tini/ds80c400/c_libraries/sdcc/index.html"
+
+\end_inset
+
+.
+
+\begin_inset VSpace bigskip
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+The Z80 and gbz80 port
+\end_layout
+
+\begin_layout Standard
+SDCC can target both the Zilog Z80
+\begin_inset LatexCommand index
+name "Z80"
+
+\end_inset
+
+ and the Nintendo Gameboy's Z80-like gbz80
+\begin_inset LatexCommand index
+name "gbz80 (GameBoy Z80)"
+
+\end_inset
+
+.
+ The Z80 port is passed through the same
+\emph on
+regressions tests
+\begin_inset LatexCommand index
+name "Regression test"
+
+\end_inset
+
+
+\emph default
+ (see section
+\begin_inset LatexCommand ref
+reference "sec:Quality-control"
+
+\end_inset
+
+) as the MCS51 and DS390 ports, so floating point support, support for long
+ variables and bitfield support is fine.
+ See mailing lists and forums about interrupt routines.
+\end_layout
+
+\begin_layout Standard
+As always, the code is the authoritative reference - see z80/ralloc.c and
+ z80/gen.c.
+ The stack
+\begin_inset LatexCommand index
+name "Z80!stack"
+
+\end_inset
+
+ frame is similar to that generated by the IAR Z80 compiler.
+ IX is used as the base pointer, HL and IY are used as a temporary registers,
+ and BC and DE are available for holding variables.
+ Return values
+\begin_inset LatexCommand index
+name "Z80!return value"
+
+\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).
+\begin_inset VSpace bigskip
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+The HC08 port
+\end_layout
+
+\begin_layout Standard
+The port to the Freescale/Motorola HC08
+\begin_inset LatexCommand index
+name "HC08"
+
+\end_inset
+
+ family has been added in October 2003, and is still undergoing some basic
+ development.
+ The code generator is complete, but the register allocation is still quite
+ unoptimized.
+ Some of the SDCC's standard C library functions have embedded non-HC08
+ inline assembly and so are not yet usable.
+\end_layout
+
+\begin_layout Standard
+The HC08 port passes the regression test suite (see section
+\begin_inset LatexCommand ref
+reference "sec:Quality-control"
+
+\end_inset
+
+).
+\begin_inset VSpace bigskip
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+The PIC14
+\begin_inset LatexCommand index
+name "PIC14"
+
+\end_inset
+
+ port
+\end_layout
+
+\begin_layout Standard
+The PIC14 port adds support for Microchip
+\begin_inset LatexCommand index
+name "Microchip"
+
+\end_inset
+
+
+\begin_inset Formula $^{\text{TM}}$
+\end_inset
+
+ PIC
+\begin_inset LatexCommand index
+name "PIC14"
+
+\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
+12F: 629, 635, 675, 683
+\end_layout
+
+\begin_layout Standard
+16C: 432, 433
+\end_layout
+
+\begin_layout Standard
+16C: 554, 557, 558
+\end_layout
+
+\begin_layout Standard
+16C: 62, 620, 620a, 621, 621a, 622, 622a, 63a, 65b
+\end_layout
+
+\begin_layout Standard
+16C: 71, 710, 711, 715, 717, 72, 73b, 745, 74b, 765, 770, 771, 773, 774,
+ 781, 782
+\end_layout
+
+\begin_layout Standard
+16C: 925, 926
+\end_layout
+
+\begin_layout Standard
+16CR: 620a, 73, 74, 76, 77
+\end_layout
+
+\begin_layout Standard
+16F: 616, 627, 627a, 628, 628a, 630, 636, 639, 648, 648a, 676, 684, 685,
+ 687, 688, 689, 690
+\end_layout
+
+\begin_layout Standard
+16F: 716, 72, 73, 737, 74, 747, 76, 767, 77, 777, 785
+\end_layout
+
+\begin_layout Standard
+16F: 818, 819, 84, 84a, 87, 870, 871, 872, 873, 873a, 874, 874a, 876, 876a,
+ 877, 877a, 88, 886, 887
+\end_layout
+
+\begin_layout Standard
+16F: 913, 914, 916, 917, 946
+\end_layout
+
+\begin_layout Standard
+26HV: 626, 785
+\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 LatexCommand index
+name "code page (pic14)"
+
+\end_inset
+
+ and Memory Banks
+\begin_inset LatexCommand index
+name "Memory bank (pic14)"
+
+\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.
+\newline
+
+\newline
+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.
+\newline
+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 open
+
+\begin_layout Standard
+
+
+\backslash
+,
+\end_layout
+
+\end_inset
+
+bit PIC MCU requires the following steps:
+\end_layout
+
+\begin_layout Enumerate
+Create a new device description.
+\newline
+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).
+\newline
+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 `__interrupt'
+\begin_inset LatexCommand index
+name "PIC14!interrupt"
+
+\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
+\newline
+{
+\newline
+\InsetSpace ~
+\InsetSpace ~
+T0IF = 0; /* Clear timer interrupt */
+\newline
+}
+\end_layout
+
+\begin_layout Subsection
+Linking and Assembling
+\end_layout
+
+\begin_layout Standard
+For assembling you can use either GPUTILS'
+\begin_inset LatexCommand index
+name "gputils (pic tools)"
+
+\end_inset
+
+ gpasm.exe or MPLAB's mpasmwin.exe.
+ GPUTILS are available from
+\begin_inset LatexCommand url
+target "http://sourceforge.net/projects/gputils"
+
+\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.
+\newline
+
+\newline
+Here is a
+\family typewriter
+Makefile
+\family default
+ using GPUTILS:
+\end_layout
+
+\begin_layout Verse
+
+\family typewriter
+.c.o:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcc -V -mpic14 -p16f877 -c $<
+\newline
+
+\newline
+$(PRJ).hex: $(OBJS)
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+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:
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcc -S -V -mpic14 -p16f877 $<
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+mpasmwin /q /o $*.asm
+\newline
+
+\newline
+$(PRJ).hex: $(OBJS)
+
+\newline
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-help):
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-debug-xtra
+\begin_inset LatexCommand index
+name "PIC14!Options!-\\/-debug-extra"
+
+\end_inset
+
+ emit debug info in assembly output
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-no-pcode-opt
+\begin_inset LatexCommand index
+name "PIC14!Options!-\\/-no-pcode-opt"
+
+\end_inset
+
+ disable (slightly faulty) optimization on pCode
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-stack-loc
+\begin_inset LatexCommand index
+name "PIC14!Options!-\\/-stack-loc"
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-stack-size
+\begin_inset LatexCommand index
+name "PIC14!Options!-\\/-stack-size"
+
+\end_inset
+
+ sets the size if the argument passing stack (default: 16, minimum: 4)
+\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 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
+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 open
+
+\begin_layout Standard
+
+
+\backslash
+,
+\end_layout
+
+\end_inset
+
+bit PIC
+\begin_inset LatexCommand index
+name "PIC14"
+
+\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 Standard
+
+\size footnotesize
+
+\newpage
+
+\end_layout
+
+\begin_layout Section
+The PIC16
+\begin_inset LatexCommand index
+name "PIC16"
+
+\end_inset
+
+ port
+\end_layout
+
+\begin_layout Standard
+The PIC16 port adds support for Microchip
+\begin_inset LatexCommand index
+name "Microchip"
+
+\end_inset
+
+
+\begin_inset Formula $^{\text{TM}}$
+\end_inset
+
+ PIC
+\begin_inset LatexCommand index
+name "PIC"
+
+\end_inset
+
+
+\begin_inset Formula $^{\text{TM}}$
+\end_inset
+
+ MCUs with 16 bit wide instructions.
+ Currently this family of microcontrollers contains the PIC18Fxxx and PIC18Fxxxx
+; devices supported by the port include:
+\end_layout
+
+\begin_layout Standard
+18F: 242, 248, 252, 258, 442, 448, 452, 458
+\end_layout
+
+\begin_layout Standard
+18F: 1220, 1320
+\end_layout
+
+\begin_layout Standard
+18F: 2220, 2221, 2320, 2321, 2331, 23k20
+\end_layout
+
+\begin_layout Standard
+18F: 2410, 2420, 2423, 2431, 2450, 2455, 2480, 24j10, 24k20
+\end_layout
+
+\begin_layout Standard
+18F: 2510, 2515, 2520, 2523, 2525, 2550, 2580, 2585, 25j10, 25k20
+\end_layout
+
+\begin_layout Standard
+18F: 2610, 2620, 2680, 2682, 2685
+\end_layout
+
+\begin_layout Standard
+18F: 4220, 4221, 4320, 4321, 4331, 43k20
+\end_layout
+
+\begin_layout Standard
+18F: 4410, 4420, 4423, 4431, 4450, 4455, 4480, 44j10, 44k20
+\end_layout
+
+\begin_layout Standard
+18F: 4510, 4515, 4520, 4523, 4525, 4550, 4580, 4585, 45j10, 45k20
+\end_layout
+
+\begin_layout Standard
+18F: 4610, 4620, 4680, 4682, 4685, 46k20
+\end_layout
+
+\begin_layout Standard
+18F: 6520, 6585, 65j50, 6620, 6680, 66j50, 66j55, 66j60, 66j65, 6720, 67j50,
+ 67j60
+\end_layout
+
+\begin_layout Standard
+18F: 8520, 8585, 85j50, 8620, 8680, 86j50, 86j55, 86j60, 86j65, 8720, 87j50,
+ 87j60
+\end_layout
+
+\begin_layout Standard
+18F: 96j60, 96j65, 97j60
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-callee-saves
+\begin_inset LatexCommand index
+name "PIC16!Options!-\\/-callee-saves"
+
+\end_inset
+
+ See -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-all-callee-saves
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-fommit-frame-pointer
+\begin_inset LatexCommand index
+name "PIC16!Options!-\\/-fommit-frame-pointer"
+
+\end_inset
+
+ Frame pointer will be omitted when the function uses no local variables.
+\end_layout
+
+\begin_layout Subsection
+Port Specific Options
+\begin_inset LatexCommand index
+name "Options PIC16"
+
+\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 Standard
+
+
+\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 Standard
+
+
+\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:
+\end_layout
+
+\begin_deeper
+\begin_layout List
+\labelwidthstring 00.00.0000
+
+\emph on
+small
+\emph default
+ Selects small stack model.
+ 8 bit stack and frame pointers.
+ Supports 256 bytes stack size.
+\end_layout
+
+\begin_layout List
+\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 Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-obanksel=n Set optimization level for inserting BANKSELs.
+\newline
+
+\end_layout
+
+\begin_deeper
+\begin_layout List
+\labelwidthstring 00.00.0000
+0 no optimization
+\end_layout
+
+\begin_layout List
+\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 List
+\labelwidthstring 00.00.0000
+2 tries to check the location of (even different) symbols and removes BANKSELs
+ if they are in the same bank.
+
+\newline
+
+\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 Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-optimize-cmp Try to optimize some compares.
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-mplab-comp MPLAB
+\begin_inset LatexCommand index
+name "PIC16!MPLAB"
+
+\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 Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-use-crt= Use a custom run-time module instead of the defaults.
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-debug-xtra Similar to -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-debug
+\begin_inset LatexCommand index
+name "-\\/-debug"
+
+\end_inset
+
+, but dumps more information.
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\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 Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-calltree Dump call tree in .calltree file.
+\end_layout
+
+\begin_layout Description
+-
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\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 When this variable exists, reading of structure
+ bitfields is optimized by directly loading FSR0 with the address of the
+ bitfield structure.
+ Normally SDCC will cast the bitfield structure to a bitfield pointer and
+ then load FSR0.
+ This step saves data ram and code space for functions that make heavy use
+ of bitfields.
+ (i.e., 80 bytes of code space are saved when compiling malloc.c with this
+ option).
+
+\end_layout
+
+\begin_layout Description
+NO_REG_OPT 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
+\end_layout
+
+\begin_layout Standard
+PIC16
+\begin_inset LatexCommand index
+name "PIC16"
+
+\end_inset
+
+ port defines the following preprocessor macros while translating a source.
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Macro
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SDCC_pic16
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Port identification
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+_
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+_pic16
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Port identification (same as above)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+pic18fxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+MCU Identification.
+
+\emph on
+xxxx
+\emph default
+ is the microcontrol identification number, i.e.
+ 452, 6620, etc
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+_
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+_18Fxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+MCU Identification (same as above)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+STACK_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 Standard
+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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Macro
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+__18Fxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+MCU Identification.
+
+\emph on
+xxxx
+\emph default
+ is the microcontrol identification number, i.e.
+ 452, 6620, etc
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+nnn = SMALL or LARGE respectively according to the memory model used for
+ SDCC
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+STACK_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 Standard
+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 LatexCommand index
+name "PIC16"
+
+\end_inset
+
+ port uses the following directories for searching header files and libraries.
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="3" columns="4">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Directory
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Description
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Target
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Command prefix
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+PIC16 specific headers
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Compiler
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+-I
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+PREFIX/sdcc/lib/pic16
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+PIC16 specific libraries
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Linker
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+-L
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Pragmas
+\begin_inset LatexCommand label
+name "sub:PIC16_Pragmas"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The PIC16
+\begin_inset LatexCommand index
+name "PIC16"
+
+\end_inset
+
+ port currently supports the following pragmas:
+\end_layout
+
+\begin_layout Description
+stack
+\begin_inset LatexCommand index
+name "PIC16!Pragmas!\\#pragma stack"
+
+\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.
+\newline
+The
+ stack pragma should be used only once in a project.
+ Multiple pragmas may result in indeterminate behaviour of the program.
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+The old format (ie.
+ #pragma stack 0x5ff) is deprecated and will cause the stack pointer to
+ cross page boundaries (or even exceed the available data RAM) and crash
+ the program.
+ Make sure that stack does not cross page boundaries when using the SMALL
+ stack model.
+\end_layout
+
+\end_inset
+
+
+\newline
+The format is as follows:
+\newline
+
+\end_layout
+
+\begin_layout LyX-Code
+#pragma stack bottom_address [stack_size]
+\newline
+
+\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 LatexCommand index
+name "PIC16!Pragmas!\\#pragma code"
+
+\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 instructs the linker to use a library module.
+\newline
+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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="block" valignment="top" leftline="true" width="20page%">
+<column alignment="left" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Keyword
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Description
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Module to link
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+ignore
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+
+\emph on
+(none)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+c
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+
+\emph on
+libc18f
+\emph default
+.lib
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+math
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+
+\emph on
+libm18f
+\emph default
+.lib
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+io
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+
+\emph on
+libio18f*
+\emph default
+.lib
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+debug
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+link the debug library
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\emph on
+libdebug
+\emph default
+.lib
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\newline
+* 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 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 Subsection
+Header Files
+\begin_inset LatexCommand label
+name "sub:PIC16_Header-Files"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+There is one main header file
+\begin_inset LatexCommand index
+name "PIC16!Header files"
+
+\end_inset
+
+ that can be included to the source files using the pic16
+\begin_inset LatexCommand index
+name "PIC16"
+
+\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 LatexCommand label
+name "sub:pic16Libraries"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The libraries
+\begin_inset LatexCommand index
+name "PIC16!Libraries"
+
+\end_inset
+
+ that PIC16
+\begin_inset LatexCommand index
+name "PIC16"
+
+\end_inset
+
+ port depends on are the microcontroller device libraries which contain
+ the symbol definitions for the microcontroller special function registers.
+ These libraries have the format pic18fxxxx.lib, where
+\emph on
+xxxx
+\emph default
+ is the microcontroller identification number.
+ The specific library is selected automatically by the compiler at link
+ stage according to the selected device.
+\end_layout
+
+\begin_layout Standard
+\noindent
+Libraries are created with gplib which is part of the gputils package
+\begin_inset LatexCommand url
+target "http://sourceforge.net/projects/gputils"
+
+\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 LatexCommand index
+name "Floating point support"
+
+\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 LatexCommand index
+name "<NO FLOAT>"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "printf floating point support"
+
+\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 appraoch 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 Standard
+
+
+\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
+\newline
+
+\family typewriter
+perl /path/to/sdcc/support/scripts/inc2h-pic16.pl /path/to/gputils/header/pDEVICE.
+inc
+\end_layout
+
+\begin_layout Enumerate
+
+\family typewriter
+mv picDEVICE.h /path/to/sdcc/device/include/pic16
+\end_layout
+
+\begin_layout Enumerate
+
+\family typewriter
+mv picDEVICE.c /path/to/sdcc/device/lib/pic16/libdev
+\end_layout
+
+\begin_layout Enumerate
+Add DEVICE to
+\family typewriter
+/path/to/sdcc/device/lib/pic16/pics.all
+\family default
+
+\newline
+Note: No 18f prefix here!
+\end_layout
+
+\begin_layout Enumerate
+Edit
+\family typewriter
+/path/to/sdcc/device/include/pic16/adc.h
+\newline
+
+\family default
+Add the new devices to the correct ADC style class (depending on the number
+ of ADC channels).
+\newline
+Do not touch
+\family typewriter
+adc.h
+\family default
+ if the device does not offer any ADC at all.
+\end_layout
+
+\begin_layout Enumerate
+Edit
+\family typewriter
+/path/to/sdcc/device/include/pic16/pic18fregs.h
+\family default
+
+\newline
+The file format is self-explanatory, just add
+\newline
+
+\family typewriter
+#elif defined(picDEVICE)
+\newline
+#
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+
+\backslash
+
+\end_layout
+
+\end_inset
+
+include <picDEVICE.h>
+\family default
+
+\newline
+at the right place (keep the file sorted, please).
+\end_layout
+
+\begin_layout Enumerate
+Edit
+\family typewriter
+/path/to/sdcc/device/include/pic16devices.txt
+\newline
+
+\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
+Add the device to
+\family typewriter
+/path/to/sdcc/device/lib/pic16/libdev/Makefile.am
+\family default
+
+\newline
+Copy an existing entry and adjust the device name.
+\end_layout
+
+\begin_layout Enumerate
+Add the device to
+\family typewriter
+/path/to/sdcc/device/lib/pic16/libio/Makefile.am
+\family default
+
+\newline
+Copy the record from the 18f2220 and adjust the device name.
+\newline
+If the new device
+ does not offer ADC, I
+\begin_inset Formula $^{\text{2}}$
+\end_inset
+
+C, and/or (E)USART functionality as assumed by the library, remove the lines
+ with references to
+\family typewriter
+adc/*.c
+\family default
+,
+\family typewriter
+usart/*.c
+\family default
+, or
+\family typewriter
+usart/*.c
+\family default
+, respectively.
+\end_layout
+
+\begin_layout Enumerate
+Update
+\family typewriter
+libdev/Makefile.in
+\family default
+ and
+\family typewriter
+libio/Makefile.in
+\family default
+ using
+\newline
+
+\family typewriter
+./bootstrap.sh
+\family default
+
+\newline
+in
+\family typewriter
+/path/to/sdcc/device/lib/pic16
+\family default
+.
+\end_layout
+
+\begin_layout Enumerate
+Recompile the pic16 libraries as described in
+\begin_inset LatexCommand ref
+reference "sub:pic16Libraries"
+
+\end_inset
+
+.
+\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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="3" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Pointer sizes according to memory model
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+small model
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+large model
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+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 Standard
+24-bits
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+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 Standard
+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 LatexCommand ref
+reference "sub: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 LatexCommand index
+name "PIC16!stack"
+
+\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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="3" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Stack & Frame pointer sizes according to stack model
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+small
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+large
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Stack pointer FSR1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+8-bits
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+16-bits
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Frame pointer FSR2
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+8-bits
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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:
+\newline
+
+\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 LatexCommand index
+name "PIC16"
+
+\end_inset
+
+ port makes available two more:
+\end_layout
+
+\begin_layout Description
+wparam
+\begin_inset LatexCommand index
+name "PIC16!wparam"
+
+\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 LatexCommand index
+name "PIC16!shadowregs"
+
+\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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+size
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+destination register
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+WREG
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+PRODL:WREG
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+PRODH:PRODL:WREG
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+FSR0L:PRODH:PRODL:WREG
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+>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 Standard
+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 LatexCommand index
+name "PIC16!interrupt"
+
+\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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\emph on
+n
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Interrupt Vector
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Interrupt Vector Address
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+0x000000
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\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 Standard
+
+\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 Standard
+0x000008
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+2
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+LOW 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 Standard
+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 actuall ISR code is placed as normally would in the code space.
+ Upon interrupt request, the GOTO instruction is executed which jumps to
+ the ISR code.
+ When declaring interrupt functions as _naked this GOTO instruction is
+\series bold
+not
+\series default
+ generated.
+ The whole interrupt functions is therefore placed at the Interrupt Vector
+ Address of the specific interrupt.
+ This is not a problem for the LOW priority interrupts, but it is a problem
+ for the RESET and the HIGH priority interrupts because code may be written
+ at the next interrupt's vector address and cause indeterminate program
+ behaviour if that interrupt is raised.
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+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 LatexCommand index
+name "PIC16"
+
+\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 open
+
+\begin_layout Standard
+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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="5" columns="5">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="left" valignment="top" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+pointer type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+7th bit
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+6th bit
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+rest of the pointer
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+data
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+\shape slanted
+\emph on
+uuuuuu uuuuxxxx xxxxxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+a 12-bit data pointer in data RAM memory
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+code
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+\shape slanted
+\emph on
+uxxxxx xxxxxxxx xxxxxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+a 21-bit code pointer in FLASH memory
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+eeprom
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+\shape slanted
+\emph on
+uuuuuu uuuuuuxx xxxxxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+a 10-bit eeprom pointer in EEPROM memory
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(unimplemented)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+\shape slanted
+\emph on
+xxxxxx xxxxxxxx xxxxxxxx
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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
+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:
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="2" columns="7">
+<features>
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="center" valignment="top" width="0">
+<column alignment="left" valignment="top" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+pointer type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+<7:6>
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+<5>
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+<4>
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+<3:0>
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+rest of the pointer
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+descrption
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+stream
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+00
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+nnnn
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+\shape slanted
+\emph on
+uuuuuuuu uuuuuuuu
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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:
+\end_layout
+
+\begin_layout Standard
+\noindent
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="4">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+stream type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+value
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+module
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+STREAM_USART
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+0x200000UL
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+USART
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Writes/Reads characters via the USART peripheral
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+STREAM_MSSP
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+0x210000UL
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+MSSP
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Writes/Reads characters via the MSSP peripheral
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+STREAM_USER
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+0x2f0000UL
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(none)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+
+
+\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 Standard
+
+
+\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 wparam
+ keyword).
+ In stdio.h exists the macro PUTCHAR(arg) that defines the putchar function
+ in a user-friendly way.
+
+\emph on
+arg
+\emph default
+ is the name of the variable that holds the character to print.
+ An example follows:
+\end_layout
+
+\begin_layout LyX-Code
+#include <pic18fregs.h>
+\newline
+#include <stdio.h>
+\newline
+
+\newline
+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
+}
+\newline
+
+\newline
+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 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:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="11" columns="4">
+<features>
+<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<column alignment="left" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+signal name
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+description
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+signal name
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+PORTB change interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+EEPROM/FLASH write complete interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+INT0 external interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+Bus collision interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+INT1 external interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+Low voltage detect interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+INT2 external interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+Parallel slave port interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+CCP1 module interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+AD convertion complete interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+CCP2 module interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+USART receive interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+TMR0 overflow interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+USART transmit interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+TMR1 overflow interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+SSP receive/transmit interrupt
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+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 Standard
+TMR2 matches PR2 interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+SIG_TMR3
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+TMR3 overflow interrupt
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\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 List
+\labelwidthstring 00.00.0000
+DEF_INTHIGH(name) begin the definition of the interrupt dispatch table for
+ high priority interrupts.
+
+\emph on
+name
+\emph default
+ is the function name to use.
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
+DEF_INTLOW(name) begin the definition of the interrupt dispatch table fo
+ low priority interrupt.
+
+\emph on
+name
+\emph default
+ is the function name to use.
+\end_layout
+
+\begin_layout List
+\labelwidthstring 00.00.0000
+DEF_HANDLER(sig,handler) define a handler for signal
+\emph on
+sig.
+\end_layout
+
+\begin_layout List
+\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 List
+\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 List
+\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>
+\newline
+
+\newline
+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
+\newline
+
+\newline
+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
+}
+\newline
+
+\newline
+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 LatexCommand index
+name "PIC16!stack"
+
+\end_inset
+
+ size (that is 64 bytes) probably is enough for many programs.
+ One must take care that when there are many levels of function nesting,
+ or there is excessive usage of stack, its size should be extended.
+ An example of such a case is the printf/sprintf family of functions.
+ If you encounter problems like not being able to print integers, then you
+ need to set the stack size around the maximum (256 for small stack model).
+ The following diagram shows what happens when calling printf to print an
+ integer:
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-fommit-frame-pointer might reduce stack usage by not creating unnecessery
+ 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 Standard
+
+\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 LatexCommand index
+name "Regression test (PIC16)"
+
+\end_inset
+
+ suite (see section
+\begin_inset 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:
+\newline
+
+\newline
+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 LatexCommand index
+name "splint (syntax checking tool)"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "lint (syntax checking tool)"
+
+\end_inset
+
+ (see -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-more-pedantic
+\begin_inset 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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-more-pedantic
+\begin_inset 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 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 LatexCommand index
+name "AOMF, AOMF51"
+
+\end_inset
+
+ file (see
+\begin_inset 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 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 LatexCommand index
+name "Oscilloscope"
+
+\end_inset
+
+ with deep trace memory is really helpful especially if you have to debug
+ a realtime application.
+ If you need to monitor more pins than your oscilloscope provides you can
+ sometimes get away with a small R-2R network.
+ On a single channel oscilloscope you could f.e.
+ monitor 2 push-pull driven pins by connecting one via a 10\InsetSpace ~
+k
+\begin_inset Formula $\Omega$
+\end_inset
+
+ resistor and the other one by a 5\InsetSpace ~
+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 LatexCommand index
+name "ICE (in circuit emulator)"
+
+\end_inset
+
+).
+ Usually very expensive.
+ And very nice to have too.
+ And usually locks you (for years...) to the devices the ICE can emulate.
+
+\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.
+
+\newline
+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 LatexCommand index
+name "AOMF, AOMF51"
+
+\end_inset
+
+ file (see
+\begin_inset 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 LatexCommand label
+name "cha:Debugging-with-SDCDB"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "SDCDB (debugger)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+SDCC is distributed with a source level debugger
+\begin_inset LatexCommand index
+name "Debugger"
+
+\end_inset
+
+.
+ The debugger uses a command line interface, the command repertoire of the
+ debugger has been kept as close to gdb
+\begin_inset LatexCommand index
+name "gdb"
+
+\end_inset
+
+ (the GNU debugger) as possible.
+ The configuration and build process is part of the standard compiler installati
+on, which also builds and installs the debugger in the target directory
+ specified during configuration.
+ The debugger allows you debug BOTH at the C source and at the ASM source
+ level.
+\end_layout
+
+\begin_layout Subsection
+Compiling for Debugging
+\end_layout
+
+\begin_layout Standard
+The -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-debug
+\begin_inset LatexCommand index
+name "-\\/-debug"
+
+\end_inset
+
+ option must be specified for all files for which debug information is to
+ be generated.
+ The compiler generates a .adb file for each of these files.
+ The linker creates the .cdb
+\begin_inset LatexCommand index
+name "<file>.cdb"
+
+\end_inset
+
+ file from the .adb
+\begin_inset LatexCommand index
+name "<file>.adb"
+
+\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 Standard
+
+
+\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 LatexCommand url
+target "http://ec2drv.sf.net/"
+
+\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).
+\newline
+
+\newline
+
+\family sans
+\series bold
+sdcdb foo
+\newline
+
+\family default
+\series default
+
+\newline
+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 LatexCommand index
+name "Intel hex format"
+
+\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 Standard
+
+
+\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 Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+-directory option should be -
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\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:
+\newline
+
+\newline
+
+\family sans
+\series bold
+sdcdb>break 100
+\newline
+sdcdb>break foo.c:100
+\newline
+sdcdb>break funcfoo
+\newline
+sdcdb>break foo.c:funcfoo
+\end_layout
+
+\begin_layout Subsubsection*
+clear [line | file:line | function | file:function ]
+\end_layout
+
+\begin_layout Standard
+Clear breakpoint at specified line or function:
+\newline
+
+\newline
+
+\family sans
+\series bold
+sdcdb>clear 100
+\newline
+sdcdb>clear foo.c:100
+\newline
+sdcdb>clear funcfoo
+\newline
+sdcdb>clear foo.c:funcfoo
+\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 Standard
+The screenshot was converted from png to eps with:
+\begin_inset Quotes sld
+\end_inset
+
+bmeps -c -e8f -p3 ddd_example.png >ddd_example.eps
+\begin_inset Quotes srd
+\end_inset
+
+ which produces a pretty compact eps file which is free from compression
+ artifacts.
+\end_layout
+
+\begin_layout Standard
+The screenshot was included in sdccman.lyx cvs version 1.120 but later removed
+ as this broke the build system on Sourceforge (pdf-file was broken.
+ pdflatex does not accept eps files).
+\end_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 LatexCommand url
+target "http://sdcc.svn.sourceforge.net/viewvc/*checkout*/sdcc/trunk/sdcc/doc/figures/ddd_example.png"
+
+\end_inset
+
+
+\size default
+ shows a screenshot of a debugging session with DDD
+\begin_inset LatexCommand index
+name "DDD (debugger)"
+
+\end_inset
+
+ (Unix only) on a simulated 8032.
+ The debugging session might not run as smoothly as the screenshot suggests.
+ The debugger allows setting of breakpoints, displaying and changing variables,
+ single stepping through C and assembler code.
+
+\newline
+The source was compiled with
+\family sans
+\series bold
+
+\newline
+
+\newline
+sdcc -
+\family default
+\series default
+
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+/
+\end_layout
+
+\end_inset
+
+
+\family sans
+\series bold
+-debug ddd_example.c
+\family default
+\series default
+
+\family sans
+\series bold
+
+\newline
+
+\family default
+\series default
+
+\newline
+and DDD was invoked with
+\family sans
+\series bold
+
+\newline
+
+\newline
+ddd -debugger "sdcdb -cpu 8032 ddd_example"
+\end_layout
+
+\begin_layout Standard
+\begin_inset Note Note
+status open
+
+\begin_layout Standard
+Check that the double quotes or an apostrophe within the command line survive
+ the 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 LatexCommand index
+name "XEmacs"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "Emacs"
+
+\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):
+\newline
+
+\newline
+
+\family typewriter
+(load-file sdcdbsrc.el)
+\family default
+
+\newline
+
+\newline
+.xemacs is a lisp file so the () around the command is REQUIRED.
+ The files can also be loaded dynamically while XEmacs is running, set the
+ environment variable 'EMACSLOADPATH' to the installation bin directory
+ (<installdir>/bin), then enter the following command ESC-x load-file sdcdbsrc.
+ To start the interface enter the following command:
+\newline
+
+\newline
+
+\family sans
+\series bold
+ESC-x sdcdbsrc
+\family default
+\series default
+
+\newline
+
+\newline
+You will prompted to enter the file name to be debugged.
+
+\newline
+
+\newline
+The command line options that are passed to the simulator directly are
+ bound to default values in the file sdcdbsrc.el.
+ The variables are listed below, these values maybe changed as required.
+\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
+\InsetSpace ~
+
+\family typewriter
+
+\newline
+;;\InsetSpace ~
+Current Listing ::
+\newline
+;;key\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+binding\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+Comment
+\newline
+;;---\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+-------\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+-------
+\newline
+;;
+\newline
+;;\InsetSpace ~
+n\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdb-next-fro
+m-src\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCDB next command
+\newline
+;;\InsetSpace ~
+b\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdb-back-from-src\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCDB back command
+\newline
+;;\InsetSpace ~
+c\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdb-cont-f
+rom-src\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCDB continue command
+\newline
+;;\InsetSpace ~
+s\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdb-step-from-src\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCDB step command
+\newline
+;;\InsetSpace ~
+?\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdb-w
+hatis-c-sexp\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCDB ptypecommand for data at
+\newline
+;;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+buffer point
+\newline
+;;\InsetSpace ~
+x\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdbsrc-delete\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCD
+B Delete all breakpoints if no arg
+\newline
+;;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+given or delete arg (C-u arg x)
+\newline
+;;\InsetSpace ~
+m\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+sdcdbsrc
+-frame\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+SDCDB Display current frame if no arg,
+\newline
+;;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+given or display frame arg
+
+\newline
+;;\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~
+\InsetSpace ~