C Cross Compiler User’s Guide For STM8 CXSTM8 Users
CXSTM8_UsersGuide
CXSTM8_UsersGuide
CXSTM8_UsersGuide
User Manual:
Open the PDF directly: View PDF
.
Page Count: 456
| Download | |
| Open PDF In Browser | View PDF |
C
OSMIC
Soft ware
Version 4.2
C Cross Compiler User’s Guide
for ST Microelectronics STM8
Copyright © COSMIC Software 1995, 2007
All Trademarks are the property of their respective owners
Table of Contents
Preface
Organization of this Manual ....................................................... 1
Chapter 1
Introduction
Introduction................................................................................. 4
Document Conventions............................................................... 4
Typewriter font..................................................................... 4
Italics .................................................................................... 5
[ Brackets ] ........................................................................... 5
Conventions.......................................................................... 6
Command Line ..................................................................... 6
Flags ..................................................................................... 6
Compiler Architecture ................................................................ 8
Predefined Symbol...................................................................... 9
Linking........................................................................................ 9
Programming Support Utilities................................................... 9
Listings...................................................................................... 10
Optimizations............................................................................ 10
Support for ROMable Code...................................................... 11
Support for eeprom ................................................................... 12
Memory Models........................................................................ 12
Chapter 2
Tutorial Introduction
Acia.c, Example file.................................................................. 14
Default Compiler Operation ............................................... 15
Compiling and Linking............................................................. 17
Step 1: Compiling............................................................... 17
Step 2: Assembler............................................................... 18
Step 3: Linking ................................................................... 19
Step 4: Generating S-Records file ...................................... 21
Linking Your Application......................................................... 23
Generating Automatic Data Initialization................................. 24
Specifying Command Line Options ......................................... 27
Chapter 3
Programming Environments
Introduction............................................................................... 30
Modifying the Runtime Startup ................................................ 32
Description of Runtime Startup Code ................................ 33
(i)
Initializing data in RAM........................................................... 34
Memory Models for code smaller than 64K............................. 37
Memory Models for code larger than 64K ............................... 38
Handling Large Code and Constants ........................................ 39
Bit Variables ............................................................................. 40
The const and volatile Type Qualifiers..................................... 41
Performing Input/Output in C................................................... 43
Referencing Absolute Addresses.............................................. 44
Accessing Internal Registers .................................................... 46
Placing Data Objects in The Bss Section ................................. 47
Placing Data Objects in Short Range Memory......................... 48
Setting Zero Page Size ....................................................... 48
Placing Data Objects in Long Range Memory ......................... 49
Placing Data Objects in the EEPROM Space........................... 50
Redefining Sections.................................................................. 51
Inserting Inline Assembly Instructions..................................... 53
Inlining with pragmas......................................................... 53
Inlining with _asm.............................................................. 54
Inlining Labels.................................................................... 56
Writing Interrupt Handlers ....................................................... 57
Placing Addresses in Interrupt Vectors .................................... 59
Inline Function.......................................................................... 60
Interfacing C to Assembly Language ....................................... 62
Register Usage .......................................................................... 64
Data Representation.................................................................. 65
Chapter 4
Using The Compiler
Invoking the Compiler.............................................................. 68
Compiler Command Line Options ..................................... 69
File Naming Conventions......................................................... 74
Generating Listings................................................................... 75
Generating an Error File ........................................................... 75
Return Status............................................................................. 75
Examples .................................................................................. 75
C Library Support ..................................................................... 76
How C Library Functions are Packaged............................. 76
Inserting Assembler Code Directly .................................... 76
Linking Libraries with Your Program................................ 76
Integer Library Functions................................................... 76
Common Input/Output Functions....................................... 77
Functions Implemented as Macros..................................... 77
(ii)
Including Header Files ....................................................... 78
Descriptions of C Library Functions ........................................ 79
Generate inline assembly code ........................................... 80
Abort program execution.................................................... 81
Find absolute value............................................................. 82
Arccosine............................................................................ 83
Arcsine................................................................................ 84
Arctangent .......................................................................... 85
Arctangent of y/x................................................................ 86
Convert buffer to double .................................................... 87
Convert buffer to integer .................................................... 88
Convert buffer to long ........................................................ 89
Test or get the carry bit....................................................... 90
Round to next higher integer .............................................. 91
Verify the recorded checksum............................................ 92
Verify the recorded checksum............................................ 93
Verify the recorded checksum............................................ 94
Verify the recorded checksum............................................ 95
Cosine ................................................................................. 96
Hyperbolic cosine............................................................... 97
Divide with quotient and remainder ................................... 98
Erase the full eeprom space ................................................ 99
Exit program execution .................................................... 100
Exponential....................................................................... 101
Find double absolute value ............................................... 102
Copy a moveable code segment in RAM ......................... 103
Round to next lower integer ............................................. 104
Find double modulus ........................................................ 105
Extract fraction from exponent part ................................. 106
Get character from input stream ....................................... 107
Get a text line from input stream...................................... 108
Test the interrupt mask bit................................................ 109
Test the interrupt line level............................................... 110
Test for alphabetic or numeric character .......................... 111
Test for alphabetic character ............................................ 112
Test for control character.................................................. 113
Test for digit ..................................................................... 114
Test for graphic character ................................................. 115
Test for lowercase character ............................................. 116
Test for printing character ................................................ 117
Test for punctuation character .......................................... 118
Test for whitespace character ........................................... 119
(iii)
Test for uppercase character............................................. 120
Test for hexadecimal digit................................................ 121
Find long absolute value .................................................. 122
Scale double exponent...................................................... 123
Long divide with quotient and remainder ........................ 124
Natural logarithm ............................................................. 125
Common logarithm .......................................................... 126
Test for maximum ............................................................ 127
Scan buffer for character .................................................. 128
Compare two buffers for lexical order ............................. 129
Copy one buffer to another............................................... 130
Copy one buffer to another............................................... 131
Propagate fill character throughout buffer ....................... 132
Test for minimum............................................................. 133
Extract fraction and integer from double ......................... 134
Raise x to the y power ...................................................... 135
Output formatted arguments to stdout.............................. 136
Put a character to output stream ....................................... 141
Put a text line to output stream......................................... 142
Generate pseudo-random number .................................... 143
Sin..................................................................................... 144
Hyperbolic sine................................................................. 145
Output arguments formatted to buffer.............................. 146
Real square root................................................................ 147
Seed pseudo-random number generator ........................... 148
Concatenate strings........................................................... 149
Scan string for first occurrence of character .................... 150
Compare two strings for lexical order.............................. 151
Copy one string to another ............................................... 152
Find the end of a span of characters in a set..................... 153
Find length of a string ...................................................... 154
Concatenate strings of length n ........................................ 155
Compare two n length strings for lexical order................ 156
Copy n length string ......................................................... 157
Find occurrence in string of character in set .................... 158
Scan string for last occurrence of character ..................... 159
Find the end of a span of characters not in set ................. 160
Scan string for first occurrence of string .......................... 161
Convert buffer to double .................................................. 162
Convert buffer to long ...................................................... 163
Convert buffer to unsigned long....................................... 164
Tangent............................................................................. 165
(iv)
Hyperbolic tangent ........................................................... 166
Convert character to lowercase if necessary .................... 167
Convert character to uppercase if necessary .................... 168
Chapter 5
Using The Assembler
Invoking castm8...................................................................... 170
Object File............................................................................... 172
Listings.................................................................................... 173
Assembly Language Syntax.................................................... 174
Instructions ....................................................................... 174
Labels ............................................................................... 175
Temporary Labels............................................................. 176
Constants .......................................................................... 176
Expressions....................................................................... 178
Macro Instructions............................................................ 179
Conditional Directives...................................................... 182
Sections............................................................................. 183
Bit Handling ..................................................................... 184
Includes............................................................................. 185
Branch Optimization............................................................... 186
Old Syntax .............................................................................. 186
C Style Directives ................................................................... 187
Assembler Directives.............................................................. 187
Align the next instruction on a given boundary ............... 188
Define the default base for numerical constants............... 189
Switch to the predefined .bsct section. ............................. 190
Turn listing of conditionally excluded code on or off...... 191
Allocate constant(s) .......................................................... 192
Allocate constant block .................................................... 193
Turn listing of debug directives on or off......................... 194
Allocate variable(s) .......................................................... 195
Conditional assembly ....................................................... 196
Conditional assembly ....................................................... 197
Stop the assembly ............................................................. 198
End conditional assembly................................................. 199
End conditional assembly................................................. 200
End macro definition ........................................................ 201
End repeat section............................................................. 202
Give a permanent value to a symbol ................................ 203
Assemble next byte at the next even address relative to the
start of a section................................................................ 204
(v)
Generate error message. ................................................... 205
Conditional assembly ....................................................... 206
Conditional assembly ....................................................... 207
Conditional assembly ....................................................... 208
Conditional assembly ....................................................... 209
Conditional assembly ....................................................... 210
Conditional assembly ....................................................... 211
Conditional assembly ....................................................... 212
Conditional assembly ....................................................... 213
Conditional assembly ....................................................... 214
Conditional assembly ....................................................... 215
Conditional assembly ....................................................... 216
Include text from another text file.................................... 217
Turn on listing during assembly....................................... 218
Give a text equivalent to a symbol ................................... 219
Create a new local block .................................................. 220
Define a macro ................................................................. 221
Send a message out to STDOUT...................................... 223
Terminate a macro definition ........................................... 224
Turn on or off listing of macro expansion........................ 225
Turn off listing. ................................................................ 226
Disable pagination in the listing file ................................ 227
Creates absolute symbols ................................................. 228
Sets the location counter to an offset from the beginning of a
section............................................................................... 229
Start a new page in the listing file .................................... 230
Specify the number of lines per pages in the listing file .. 231
Repeat a list of lines a number of times ........................... 232
Repeat a list of lines a number of times ........................... 233
Restore saved section ....................................................... 235
Terminate a repeat definition ........................................... 236
Save section...................................................................... 237
Turn on or off section crossing......................................... 238
Define a new section ........................................................ 239
Give a resetable value to a symbol................................... 241
Insert a number of blank lines before the next statement in the
listing file.......................................................................... 242
Place code into a section. ................................................. 243
Specify the number of spaces for a tab character in the listing
file..................................................................................... 244
Define default header ....................................................... 245
Declare bit symbol as being defined elsewhere ............... 246
Declare a variable to be visible ........................................ 247
(vi)
Declare symbol as being defined elsewhere..................... 248
Chapter 6
Using The Linker
Introduction............................................................................. 251
Overview................................................................................. 252
Linker Command File Processing........................................... 254
Inserting comments in Linker commands ........................ 255
Linker Options ........................................................................ 256
Global Command Line Options........................................ 257
Segment Control Options ................................................. 258
Segment Grouping............................................................ 262
Linking Files on the Command line ................................. 262
Example............................................................................ 263
Include Option .................................................................. 263
Example............................................................................ 263
Private Region Options..................................................... 264
Symbol Definition Option ................................................ 265
Reserve Space Option....................................................... 267
Handle Dependencies ....................................................... 267
Section Relocation .................................................................. 268
Address Specification....................................................... 268
Overlapping Control......................................................... 268
Setting Bias and Offset ........................................................... 268
Setting the Bias................................................................. 269
Setting the Offset.............................................................. 269
Using Default Placement.................................................. 269
Bit Segment Handling ...................................................... 269
Linking Objects....................................................................... 270
Linking Library Objects.......................................................... 270
Library Order.................................................................... 271
Libraries Setup Search Paths ............................................ 271
Automatic Data Initialization.................................................. 272
Descriptor Format............................................................. 272
Moveable Code ....................................................................... 273
Checksum Computation.......................................................... 275
DEFs and REFs....................................................................... 277
Special Topics......................................................................... 278
Private Name Regions ...................................................... 278
Renaming Symbols........................................................... 278
Absolute Symbol Tables................................................... 282
Description of The Map File................................................... 283
(vii)
Return Value........................................................................... 284
Linker Command Line Examples........................................... 285
Chapter 7
Debugging Support
Generating Debugging Information........................................ 288
Generating Line Number Information.............................. 288
Generating Data Object Information................................ 288
The cprd Utility ...................................................................... 290
Command Line Options ................................................... 290
Examples .......................................................................... 291
The clst utility ......................................................................... 292
Command Line Options ................................................... 292
Chapter 8
Programming Support
The chex Utility ...................................................................... 296
Command Line Options ................................................... 296
Return Status .................................................................... 298
Examples .......................................................................... 298
The clabs Utility ..................................................................... 300
Command Line Options ................................................... 300
Return Status .................................................................... 301
Examples .......................................................................... 301
The clib Utility........................................................................ 303
Command Line Options ................................................... 303
Return Status .................................................................... 304
Examples .......................................................................... 304
The cobj Utility....................................................................... 306
Command Line Options ................................................... 306
Return Status .................................................................... 307
Examples .......................................................................... 307
The cv695 Utility.................................................................... 308
Command Line Options ................................................... 308
The cvdwarf Utility ................................................................ 312
Command Line Options ................................................... 312
Return Status .................................................................... 314
Examples .......................................................................... 314
Chapter A
Compiler Error Messages
Parser (cpstm8) Error Messages ............................................. 316
(viii)
Code Generator (cgstm8) Error Messages.............................. 330
Assembler (castm8) Error Messages ...................................... 331
Linker (clnk) Error Messages ................................................. 334
Chapter B
Modifying Compiler Operation
The Configuration File............................................................ 338
Changing the Default Options ................................................ 340
Creating Your Own Options............................................. 340
Example .................................................................................. 341
Chapter C
STM8 Machine Library
Update an int bitfield in external memory........................ 345
Quotient of unsigned char division................................... 346
Quotient of unsigned char division................................... 347
Eeprom char bit field update ............................................ 348
Write a char in eeprom ..................................................... 349
Write a long int in eeprom................................................ 350
Write a short int in eeprom............................................... 351
Move a structure in eeprom .............................................. 352
Add float to float .............................................................. 353
Compare floats.................................................................. 354
Divide float by float.......................................................... 355
Add float to float in memory ............................................ 356
Multiply float by float in memory .................................... 357
Subtract float from float in memory................................. 358
Multiply float by float ...................................................... 359
Negate a float.................................................................... 360
Subtract float from float ................................................... 361
Convert float to integer..................................................... 362
Convert float into long integer ......................................... 363
Compare a float in memory to zero .................................. 364
Get a long word from external memory ........................... 365
Get a long word from external memory ........................... 366
Get a word from external memory ................................... 367
Get a word from external memory ................................... 368
Quotient of integer division.............................................. 369
Integer multiplication ....................................................... 370
Convert integer into float.................................................. 371
Convert integer into long.................................................. 372
Perform C switch statement on long ................................ 373
(ix)
Long integer addition ....................................................... 374
Bitwise AND for long integers......................................... 375
Long integer compare....................................................... 376
Quotient of long integer division ..................................... 377
Long addition ................................................................... 378
Long bitwise AND ........................................................... 379
Long shift left ................................................................... 380
Long multiplication in memory........................................ 381
Negate a long integer in memory ..................................... 382
Long bitwise OR .............................................................. 383
Signed long shift right ...................................................... 384
Long subtraction............................................................... 385
Unsigned long shift right.................................................. 386
Long bitwise exclusive OR .............................................. 387
Long integer shift left ....................................................... 388
Remainder of long integer division .................................. 389
Multiply long integer by long integer .............................. 390
Negate a long integer........................................................ 391
Bitwise OR with long integers ......................................... 392
Long integer right shift..................................................... 393
Long test against zero....................................................... 394
Long integer subtraction................................................... 395
Convert long integer into float ......................................... 396
Load memory into long register ....................................... 397
Quotient of unsigned long integer division ...................... 398
Remainder of unsigned long integer division................... 399
Unsigned long integer shift right...................................... 400
Bitwise exclusive OR with long integers ......................... 401
Compare a long integer to zero ........................................ 402
Put a long integer in external memory ............................. 403
Put a long integer in external memory ............................. 404
Put a word in extended memory....................................... 405
Store long register in memory .......................................... 406
Store long register in external memory ............................ 407
Quotient of signed char division ...................................... 408
Quotient of signed char division ...................................... 409
Multiply long integer by unsigned byte ........................... 410
Quotient of unsigned integer division .............................. 411
Convert unsigned integer into float .................................. 412
Convert unsigned integer into long .................................. 413
Convert unsigned long integer into float.......................... 414
Copy a structure into another ........................................... 415
(x)
Copy a structure in external memory ............................... 416
Copy a structure into another ........................................... 417
Copy a structure in external memory ............................... 418
Chapter D
Compiler Passes
The cpstm8 Parser................................................................... 420
Command Line Options ................................................... 420
Return Status .................................................................... 424
Example............................................................................ 424
The cgstm8 Code Generator ................................................... 425
Command Line Options ................................................... 425
Return Status .................................................................... 427
Example............................................................................ 427
The costm8 Assembly Language Optimizer........................... 428
Command Line Options ................................................... 428
Disabling Optimization .................................................... 429
Return Status .................................................................... 429
Example............................................................................ 429
(xi)
Preface
T
he Cross Compiler User's Guide for STM8 is a reference guide for
programmers writing C programs for STM8 microcontroller environments. It provides an overview of how the cross compiler works,
and explains how to compile, assemble, link and debug programs. It
also describes the programming support utilities included with the cross
compiler and provides tutorial and reference information to help you
configure executable images to meet specific requirements. This manual assumes that you are familiar with your host operating system and
with your specific target environment.
Organization of this Manual
This manual is divided into eight chapters and four appendixes.
Chapter 1, “Introduction”, describes the basic organization of the C
compiler and programming support utilities.
Chapter 2, “Tutorial Introduction”, is a series of examples that demonstrates how to compile, assemble and link a simple C program.
Chapter 3, “Programming Environments”, explains how to use the features of C for STM8 to meet the requirements of your particular application. It explains how to create a runtime startup for your application,
and how to write C routines that perform special tasks such as: serial I/
O, direct references to hardware addresses, interrupt handling, and
assembly language calls.
© 2007 COSMIC Software
Preface
1
Organization of this Manual
Chapter 4, “Using The Compiler”, describes the compiler options. This
chapter also describes the functions in the C runtime library.
Chapter 5, “Using The Assembler”, describes the STM8 assembler and
its options. It explains the rules that your assembly language source
must follow, and it documents all the directives supported by the assembler.
Chapter 6, “Using The Linker”, describes the linker and its options.
This chapter describes in detail all the features of the linker and their
use.
Chapter 7, “Debugging Support”, describes the support available for
COSMIC's C source level cross debugger and for other debuggers or incircuit emulators.
Chapter 8, “Programming Support”, describes the programming support utilities. Examples of how to use these utilities are also included.
Appendix A, “Compiler Error Messages”, is a list of compile time
error messages that the C compiler may generate.
Appendix B, “Modifying Compiler Operation”, describes the “configuration file” that serves as default behaviour to the C compiler.
Appendix C, “STM8 Machine Library”, describes the assembly language routines that provide support for the C runtime library.
Appendix D, “Compiler Passes”, describes the specifics of the parser,
code generator and assembly language optimizer and the command line
options that each accepts.
This manual also contains an Index.
2
Preface
© 2007 COSMIC Software
CHAPTER
1
Introduction
This chapter explains how the compiler operates. It also provides a
basic understanding of the compiler architecture. This chapter includes
the following sections:
•
Introduction
•
Document Conventions
•
Compiler Architecture
•
Predefined Symbol
•
Linking
•
Programming Support Utilities
•
Listings
•
Optimizations
•
Support for ROMable Code
•
Support for eeprom
•
Memory Models
© 2007 COSMIC Software
Introduction
3
1
Introduction
Introduction
The C cross compiler targeting the STM8 microcontroller reads C
source files, assembly language source files, and object code files, and
produces an executable file. You can request listings that show your C
source interspersed with the assembly language code and object code
that the compiler generates. You can also request that the compiler generate an object module that contains debugging information that can be
used by COSMIC’s C source level cross debugger or by other debuggers or in-circuit emulators.
You begin compilation by invoking the cxstm8 compiler driver with
the specific options you need and the files to be compiled.
Document Conventions
In this documentation set, we use a number of styles and typefaces to
demonstrate the syntax of various commands and to show sample text
you might type at a terminal or observe in a file. The following is a list
of these conventions.
Typewriter font
Used for user input/screen output. Typewriter (or courier) font is
used in the text and in examples to represent what you might type at a
terminal: command names, directives, switches, literal filenames, or
any other text which must be typed exactly as shown. It is also used in
other examples to represent what you might see on a screen or in a
printed listing and to denote executables.
To distinguish it from other examples or listings, input from the user
will appear in a shaded box throughout the text. Output to the terminal
or to a file will appear in a line box.
For example, if you were instructed to type the compiler command that
generates debugging information, it would appears as:
cxstm8 +debug acia.c
Typewriter font enclosed in a shaded box indicates that this line is
entered by the user at the terminal.
4
Introduction
© 2007 COSMIC Software
Document Conventions
If, however, the text included a partial listing of the file acia.c ‘an
example of text from a file or from output to the terminal’ then typewriter font would still be used, but would be enclosed in a line box:
/* defines the ACIA as a structure */
struct acia {
char status;
char data;
} acia @0x6000;
NOTE
Due to the page width limitations of this manual, a single invocation line
may be represented as two or more lines. You should, however, type the
invocation as one line unless otherwise directed.
Italics
Used for value substitution. Italic type indicates categories of items for
which you must substitute appropriate values, such as arguments or
hypothetical filenames. For example, if the text was demonstrating a
hypothetical command line to compile and generate debugging information for any file, it might appear as:
cxstm8 +debug file.c
In this example, cxstm8 +debug file.c is shown in typewriter font
because it must be typed exactly as shown. Because the filename must
be specified by the user, however, file is shown in italics.
[ Brackets ]
Items enclosed in brackets are optional. For example, the line:
[ options ]
means that zero or more options may be specified because options
appears in brackets. Conversely, the line:
options
means that one or more options must be specified because options is not
enclosed by brackets.
© 2007 COSMIC Software
Introduction
5
1
Document Conventions
As another example, the line:
file1.[o|sm8]
means that one file with the extension .o or .sm8 may be specified, and
the line:
file1 [ file2 . . . ]
means that additional files may be specified.
Conventions
All the compiler utilities share the same optional arguments syntax.
They are invoked by typing a command line.
Command Line
A command line is generally composed of three major parts:
program_name []
where is the name of the program to run, an
optional series of flags, and a series of files. Each element of a
command line is usually a string separated by whitespace from all the
others.
Flags
Flags are used to select options or specify parameters. Options are recognized by their first character, which is always a ‘-’ or a ‘+’, followed
by the name of the flag (usually a single letter). Some flags are simply
yes or no indicators, but some must be followed by a value or some
additional information. The value, if required, may be a character
string, a single character, or an integer. The flags may be given in any
order, and two or more may be combined in the same argument, so long
as the second flag can’t be mistaken for a value that goes with the previous one.
It is possible for each utility to display a list of accepted options by
specifying the -help option. Each option will be displayed alphabetically on a separate line with its name and a brief description. If an
option requires additional information, then the type of information is
6
Introduction
© 2007 COSMIC Software
Document Conventions
indicated by one of the following code, displayed immediately after the
option name:
Code
Type of information
*
character string
#
short integer
##
long integer
?
single character
If the code is immediately followed by the character ‘>’, the option may
be specified more than once with different values. In that case, the
option name must be repeated for every specification.
For example, the options of the chex utility are:
chex [options] file
-a##
absolute file start address
-b##
address bias
-e##
entry point address
-f?
output format
-h
suppress header
+h*
specify header string
-m#
maximum data bytes per line
-n*>
output only named segments
-o*
output file name
-p
use paged address format
-pp
use paged address with mapping
-pn
use paged address in bank only
-s
output increasing addresses
-x*
exclude named segment
chex accepts the following distinct flags:
Flag
Function
-a
accept a long integer value
-b
accept a long integer value
© 2007 COSMIC Software
Introduction
7
1
Compiler Architecture
Flag
Function
-e
accept a long integer value
-f
accept a single character
-h
simply a flag indicator
+h
accept a character string
-m
accept a short integer value
-n
accept a character string and may be repeated
-o
accept a character string
-p
simply a flag indicator
-pn
simply a flag indicator
-pp
simply a flag indicator
-s
simply a flag indicator
-x
accept a character string and may be repeated
Compiler Architecture
The C compiler consists of several programs that work together to
translate your C source files to executable files and listings. cxstm8
controls the operation of these programs automatically, using the
options you specify, and runs the programs described below in the order
listed:
cpstm8 - the C preprocessor and language parser. cpstm8 expands
directives in your C source and parses the resulting text.
cgstm8 - the code generator. cgstm8 accepts the output of cpstm8 and
generates assembly language statements.
costm8 - the assembly language optimizer. costm8 optimizes the
assembly language code that cgstm8 generates.
castm8 - the assembler. castm8 converts the assembly language output of costm8 to a relocatable object module.
8
Introduction
© 2007 COSMIC Software
Predefined Symbol
Predefined Symbol
The COSMIC compiler defines the __CSMC__ preprocessor symbol. It
expands to a numerical value whose each bit indicates if a specific
option has been activated:
bit 2
set if unsigned char option specified (-pu)
bit 4
set if reverse bitfield option specified (+rev)
bit 5
set if no enum optimization specified (-pne)
Linking
clnk combines all the object modules that make up your program with
the appropriate modules from the C library. You can also build your
own libraries and have the linker select files from them as well. The
linker generates an executable file which, after further processing with
the chex utility, can be downloaded and run on your target system. If
you specify debugging options when you invoke cxstm8, the compiler
will generate a file that contains debugging information. You can then
use the COSMIC’s debugger to debug your code.
Programming Support Utilities
Once object files are produced, you run clnk (the linker) to produce an
executable image for your target system; you can use the programming
support utilities to inspect the executable.
chex - absolute hex file generator. chex translates executable images
produced by the linker into hexadecimal interchange formats, for use
with in-circuit emulators and PROM programmers. chex produces the
following formats:
- Motorola S-record format
- standard Intel hex format
clabs - absolute listing utility. clabs translates relocatable listings produced by the assembler by replacing all relocatable information by
absolute information. This utility must to be used only after the linker.
© 2007 COSMIC Software
Introduction
9
1
Listings
clib - build and maintain object module libraries. clib allows you to
collect related files into a single named library file for convenient storage. You use it to build and maintain object module libraries in standard
library format.
cobj - object module inspector. cobj allows you to examine standard
format executable and relocatable object files for symbol table information and to determine their size and configuration.
cv695 - IEEE695 format converter. cv695 allows you to generate
IEEE695 format file. This utility must to be used only after the linker.
cvdwarf - ELF/DWARF format converter. cvdwarf allows you to convert a file produced by the linker into an ELF/DWARF format file.
Listings
Several options for listings are available. If you request no listings, then
error messages from the compiler are directed to your terminal, but no
additional information is provided. Each error is labelled with the C
source file name and line number where the error was detected.
If you request an assembly language and object code listing with interspersed C source, the compiler merges the C source as comments
among the assembly language statements and lines of object code that it
generates. Unless you specify otherwise, the error messages are still
written to your terminal. Your listing is the listing output from the
assembler.
Optimizations
The C cross compiler performs a number of compile time and optimizations that help make your application smaller and faster:
10
•
The compiler will perform arithmetic operations in 8-bit precision
if the operands are 8-bit.
•
The compiler eliminates unreachable code.
•
The compiler performs multiplication by powers of two as faster
shift instructions.
Introduction
© 2007 COSMIC Software
Support for ROMable Code
•
Branch shortening logic chooses the smallest possible jump/
branch instructions. Jumps to jumps and jumps over jumps are
eliminated as well.
•
Integer and float constant expressions are folded at compile time.
•
Redundant load and store operations are removed.
•
enum is large enough to represent all of its declared values, each
of which is given a name. The names of enum values occupy the
same space as type definitions, functions and object names. The
compiler provides the ability to declare an enum using the smallest type char, int or long:
•
An optimized switch statement produces combinations of tests
and branches, jump tables for closely spaced case labels, a scan
table for a small group of loosely spaced case labels, or a sorted
table for an efficient search.
•
The functions in the C library are packaged in three separate
libraries; one of them is built without floating point support. If
your application does not perform floating point calculations, you
can decrease its size and increase its runtime efficiency by linking
with the non-floating-point version of the modules needed.
Support for ROMable Code
The compiler provides the following features to support ROMable code
production. See Chapter 3 for more information.
•
Referencing of absolute hardware addresses;
•
Control of the STM8 interrupt system;
•
Automatic data initialization;
•
User configurable runtime startup file;
•
Support for mixing C and assembly language code; and
•
User configurable executable images suitable for direct input to a
PROM programmer or for direct downloading to a target system.
© 2007 COSMIC Software
Introduction
11
1
Support for eeprom
Support for eeprom
The compiler provides the following features to support eeprom handling:
•
@eeprom type qualifier to describe a variable as an eeprom location. The compiler generates special sequences when the variable
is modified.
•
Library functions for erasure, initialization and copy of eeprom
locations.
NOTE
The basic routine to program an eeprom byte is located in the library file
eeprom.s and has been written using the default input/output address .
This file must be modified if using a different base address.
These basic routines are not updating any watchdog, so applications
enabling a watchdog must modify these routines to add watchdog
updates in the wait loops.
Memory Models
The STM8 compiler supports several memory models allowing you to
choose the best configuration for your processor and your application.
You can choose to use the physical stack for functions arguments and
local variables, or to simulate such a stack in memory thus leaving more
space on the stack for return addresses and interrupt stacks. You can
also specify where those areas are located in the memory space, inside
or outside the zero page (short addressing). For more information,
please refer to Chapter 3.
For information on using the compiler, see Chapter 4.
For information on using the assembler, see Chapter 5.
For information on using the linker, see Chapter 6.
For information on debugging support, see Chapter 7.
For information on using the programming utilities, see Chapter 8.
For information on the compiler passes, see Appendix D.
12
Introduction
© 2007 COSMIC Software
CHAPTER
2
Tutorial Introduction
This chapter will demonstrate, step by step, how to compile, assemble
and link the example program acia.c, which is included on your distribution media. Although this tutorial cannot show all the topics relevant
to the COSMIC tools, it will demonstrate the basics of using the compiler for the most common applications.
In this tutorial you will find information on the following topics:
•
Default Compiler Operation
•
Compiling and Linking
•
Linking Your Application
•
Generating Automatic Data Initialization
•
Specifying Command Line Options
© 2007 COSMIC Software
Tutorial Introduction
13
2
Acia.c, Example file
Acia.c, Example file
The following is a listing of acia.c. This C source file is copied during
the installation of the compiler:
/*
STM8 EXAMPLE PROGRAM WITH INTERRUPT HANDLING
*
Copyright (c) 2007 by COSMIC Software
*/
#include
#define SIZE64
#define TRDE0x80
/* buffer size */
/* transmit ready bit */
/*
Authorize interrupts.
*/
#define rim() _asm("rim")
/*
Some variables
*/
char buffer[SIZE];
char *ptlec;
char *ptecr;
/* reception buffer */
/* read pointer */
/* write pointer */
/*
Character reception.
*
Loops until a character is received.
*/
char getch(void)
{
char c;
/* character to be returned */
while (ptlec == ptecr) /* equal pointers => loop */
;
c = *ptlec++;
/* get the received char */
if (ptlec >= &buffer[SIZE])/* put in in buffer */
ptlec = buffer;
return (c);
}
/*
Send a char to the SCI.
*/
void outch(char c)
{
while (!(USART_SR & TRDE))/* wait for READY */
;
USART_DR = c;
/* send it */
}
14
Tutorial Introduction
© 2007 COSMIC Software
Acia.c, Example file
/*
Character reception routine.
*
This routine is called on interrupt.
*
It puts the received char in the buffer.
*/
@interrupt void recept(void)
{
USART_SR;
/* clear interrupt */
*ptecr++ = USART_DR;
/* get the char */
if (ptecr >= &buffer[SIZE])
/* put it in buffer */
ptecr = buffer;
}
/*
Main program.
*
Sets up the SCI and starts
*
of receive transmit.
*/
void main(void)
{
ptecr = ptlec = buffer; /*
USART_BRR1 = 0xc9;
/*
USART_CR1 = 0x00;
/*
USART_CR2 = 0x2c;
/*
rim();
/*
for (;;)
/*
outch(getch());
/*
}
an infinite loop
initialize pointers */
parameter for baud rate */
param. for word length */
parameters for interrupt */
authorize interrupts */
loop */
get and put a char */
Default Compiler Operation
By default, the compiler compiles and assembles your program. You
may then link object files using clnk to create an executable program.
The compiler supports several memory models, for applications smaller
or larger than 64K, defining how the stack is used and where variables
are allocated. A model option should always be specified on the command line; if nothing is specified, the compiler assumes the +modsl
option (physical stack and globals in long range). See “Memory Models
for code smaller than 64K” in Chapter 3 and “Memory Models for
code larger than 64K” in Chapter 3 for more information.
As it processes the command line, cxstm8 echoes the name of each
input file to the standard output file (your terminal screen by default).
You can change the amount of information the compiler sends to your
terminal screen using command line options, as described later.
© 2007 COSMIC Software
Tutorial Introduction
15
2
Acia.c, Example file
According to the options you will use, the following files, recognized
by the COSMIC naming conventions, will be generated:
file.s
file.o
file.sm8
16
Tutorial Introduction
Assembler source module
Relocatable object module
input (e.g. libraries) or output (e.g. absolute executable)
file for the linker
© 2007 COSMIC Software
Compiling and Linking
Compiling and Linking
To compile and assemble acia.c using the short stack model, type:
cxstm8 +mods acia.c
The compiler writes the name of the input file it processes:
acia.c:
The result of the compilation process is an object module named acia.o
produced by the assembler. We will, now, show you how to use the different components.
Step 1: Compiling
The first step consists in compiling the C source file and producing an
assembly language file named acia.s.
cxstm8 +mods -s acia.c
The -s option directs cxstm8 to stop after having produced the assembly
file acia.s. You can then edit this file with your favourite editor. You can
also visualize it with the appropriate system command (type, cat,
more,...). For example under MS/DOS you would type:
type acia.s
If you wish to get an interspersed C and assembly language file, you
should type:
cxstm8 +mods -l acia.c
© 2007 COSMIC Software
Tutorial Introduction
17
2
Compiling and Linking
The -l option directs the compiler to produce an assembly language file
with C source line interspersed in it. Please note that the C source lines
are commented in the assembly language file: they start with ‘;’.
As you use the C compiler, you may find it useful to see the various
actions taken by the compiler and to verify the options you selected.
The -v option, known as verbose mode, instructs the C compiler to display all of its actions. For example if you type:
cxstm8 +mods -v -s acia.c
the display will look like something similar to the following:
acia.c:
cpstm8 -o \2.cx1 -i\cxstm8\hstm8 -u -hmods.h acia.c
cgstm8 -o \2.cx2 \2.cx1
costm8 -o acia.s \2.cx2
The compiler runs each pass:
cpstm8
the C parser
cgstm8
the assembly code generator
costm8
the optimizer
Step 2: Assembler
The second step of the compilation is to assemble the code previously
produced. The relocatable object file produced is acia.o.
cxstm8 acia.s
or
castm8 -i\cxstm8\hstm8 acia.s
if you want to use directly the macro cross assembler.
18
Tutorial Introduction
© 2007 COSMIC Software
Compiling and Linking
The cross assembler can provide, when necessary, listings, symbol
table, cross reference and more. The following command will generate
a listing file named acia.ls that will also contain a cross reference:
castm8 -c -l acia.s
For more information, see Chapter 5, “Using The Assembler”.
Step 3: Linking
This step consists in linking relocatable files, also referred to as object
modules, produced by the compiler or by the assembler (.o) into
an absolute executable file: acia.sm8 in our example. Code and data
sections will be located at absolute memory addresses. The linker is
used with a command file (acia.lkf in this example).
An application that uses one or more object module(s) may require several sections (code, data, interrupt vectors, etc.,...) located at different
addresses. Each object module contains several sections. The compiler
creates the following sections:
Type
Description
.text
code (or program) section (e.g. ROM)
.fconst
large constant and literal data (e.g. ROM, see @far)
.const
constant and literal data (e.g. ROM)
.data
initialized data in long addressing range memory
(see @near in chapter 3) (e.g. RAM)
.bss
all non initialized data in long range memory (e.g.
RAM)
.bsct
initialized data in the first 256 bytes (see @tiny in
chapter 3), also called zero page or short addressing range.
.ubsct
non initialized data in the zero page
.fdata
large variables (@far)
.eeprom
any variable in eeprom (@eeprom)
.bit
bit variables in the zero page
© 2007 COSMIC Software
Tutorial Introduction
19
2
Compiling and Linking
In our example, and in the test file provided with the compiler, the
acia.lkf file contains the following information:
line
line
line
line
line
line
line
line
line
line
line
line
line
1 # LINK COMMAND FILE FOR TEST PROGRAM
2 # Copyright (c) 2002 by COSMIC Software
3 #
4 +seg .text -b0xf000 -n.text# program start address
5 +seg .const -a .text
# constants follow code
6 +seg .bsct -b0x0 -m0x100# zero page start address
7 +seg .ubsct
# uninitialized zero page
8 crts.o
# startup routine
9 acia.o
# application program
10 \cx32\lib\libis.sm8
# C library (if needed)
11 \cx32\lib\libm.sm8
# machine library
12 +seg .vector -b0x8000 # vectors start address
13 vector.o
# interrupt vectors
You can create your own link command file by modifying the one provided with the compiler.
Here is the explanation of the lines in acia.lkf:
lines 1 to 3: These are comment lines. Each line can include comments.
They must be prefixed by the “#” character.
line 4: +seg .text -b0xf000 creates a text (code) segment located
at f000 (hex address) named .text.
line 5: +seg .const -n.text creates a constant segment following
the text segment.
line 6: +seg .bsct -b0x0 -m0x100 creates a zero page segment
located at 0 (hex address) with a maximum size of 256 bytes.
line 7: +seg .ubsct creates an uninitialized zero page segment
located by default after the .bsct segment.
line 8: crts.o runtime startup code. It will be located at 0xf000
(code segment)
line 9: acia.o, the file that constitutes your application. It follows the
startup routine for code and data
20
Tutorial Introduction
© 2007 COSMIC Software
Compiling and Linking
line 10: libis.sm8 the integer library to resolve references
line 11: libm.sm8 the machine library to resolve references
line 12: +seg .vector -b0x8000 creates a segment vector (const)
segment located at 8000 (hex address)
line 13: vectors.o interrupt vectors file
By default and in our example, the .bss segment follows the .data segment.
The crts.o file contains the runtime startup that performs the following
operations:
•
initialize the bss, if any
•
initialize the stack pointer
•
call main() or any other chosen entry point.
For more information, see “Modifying the Runtime Startup” in Chapter
3.
After you have modified the linker command file, you can link by typing:
clnk -o acia.sm8 acia.lkf
Step 4: Generating S-Records file
Although acia.sm8 is an executable image, it may not be in the correct
format to be loaded on your target. Use the chex utility to translate the
format produced by the linker into standard formats. To translate
acia.sm8 to Motorola standard S-record format:
chex acia.sm8 > acia.hex
or
© 2007 COSMIC Software
Tutorial Introduction
21
2
Compiling and Linking
chex -o acia.hex acia.sm8
acia.hex is now an executable image in Motorola S-record format and
is ready to be loaded in your target system.
For more information, see “The chex Utility” in Chapter 8.
22
Tutorial Introduction
© 2007 COSMIC Software
Linking Your Application
Linking Your Application
You can create as many text, data and bss segments as your application
requires. For example, assume we have one bss, two data and two text
segments. Our link command file will look like:
+seg .text -b 0xf000 -n .text #
+seg .const -a .text
#
+seg .data -b 0x100
#
+seg .bss -b 0x200
#
+seg .bsct -b0x0 -m0x100
#
+seg .ubsct -n iram
#
crts.o
#
acia.o
#
module1.o
#
+seg .text -b 0x2000
#
module2.o
#
module3.o
#
\cx\lib\libis.sm8
#
\cx\lib\libm.sm8
#
+seg .vector -b0x8000
#
vector.o
#
#
# define these symbols if crtsi
#
#+def __endzp=@.ubsct
#
#+def __memory=@.bss
#
program start address
constant follow
data start address
bss start address
zpage start address
uninitialized zero page
startup routine
main program
application program
start new text section
application program
application program
C library (if needed)
machine library
vectors start address
interrupt vectors
is used
end of uninitialized zpage
symbol used by startup
In this example the linker will locate and merge crts.o, acia.o and
module1.o in a text segment at 0xf000, a data segment at 0x100 and a
bss segment, if needed at 0x200. zero page variables will be located at
0x0. The rest of the application, module2.o and module3.o and the
libraries will be located and merged in a new text segment at 0x2000
then the interrupt vectors file, vector.o in a vector segment at 0x8000.
All constants will be located after the first text segment.
For more information about the linker, see Chapter 6, “Using The
Linker”.
© 2007 COSMIC Software
Tutorial Introduction
23
2
Generating Automatic Data Initialization
Generating Automatic Data Initialization
Usually, in embedded applications, your program must reside in ROM.
This is not an issue when your application contains code and read-only
data (such as string or const variables). All you have to do is burn a
PROM with the correct values and plug it into your application board.
The problem comes up when your application uses initial data values
that you have defined with initialized static data. These static data values must reside in RAM.
There are two types of static data initializations:
1) data that is explicitly initialized to a non-zero value:
char var1 = 25;
which is generated into the .bsct section and
2) data that is explicitly initialized to zero or left uninitialized:
char var2;
which is generated into the .ubsct section.
There is one exception to the above rules when you declare data that
will be located in the external memory, using the @near type qualifier. In this case, the data is generated into the .data section if it is initialized or in the .bss section otherwise.
The first method to ensure that these values are correct consists in adding code in your application that reinitializes them from a copy that you
have created and located in ROM, at each restart of the application.
The second method is to use the crtsi.sm8 start-up file:
1) that defines a symbol that will force the linker to create a copy of
the initialized RAM in ROM
2) and that will do the copy from ROM to RAM
24
Tutorial Introduction
© 2007 COSMIC Software
Generating Automatic Data Initialization
The following link file demonstrates how to achieve automatic data initialization.
# demo.lkf: link command with automatic init
+seg .text -b 0xf000 -n .text # program start address
+seg .const -a .text
# constant follow
+seg .bsct -b 0x0 -m 0x100
# zpage start address
+seg .data -b0x100
# data start address
\cx32\lib\crtsi.sm8
# startup with auto-init
acia.o
# main program
module1.o
# module program
\cx32\lib\libis.sm8
# C library (if needed)
\cx32\lib\libm.sm8
# machine library
+seg .vector -b 0x8000
# vectors start address
vector.o
# interrupt vectors
# define these symbols if crtsi is used
+def __endzp=@.ubsct
# end of uninitialized zpage
+def __memory=@.bss
# end of bss segment
In the above example, the text segment is located at address 0xf000,
the data segment is located at address 0x100, immediately followed by
the bss segment that contains uninitialized data. The initialized data in
ROM will follow the descriptor created by the linker after the code segment.
In case of multiple code and data segments, a link command file could
be:
# demoinit.lkf: link command with automatic init
+seg .text -b 0xf000 -n .text # program start address
+seg .const -a .text
# constant follow
+seg .bsct -b 0x0 -m 0x100
# zpage start address
+seg .data -b0x100
# data start address
\cx32\lib\crtsi.sm8
# startup with auto-init
acia.o
# main program
module1.o
# module program
+seg .text -b0xf800
# new code segment
module2.o
# module program
module3.o
# module program
\cx32\lib\libis.sm8
# C library (if needed)
\cx32\lib\libm.sm8
# machine library
+seg .vector -b 0x8000
# vectors start address
vector.o
# interrupt vectors
# define these symbols if crtsi is used
+def __endzp=@.ubsct
# end of uninitialized zpage
+def __memory=@.bss
# end of bss segment
© 2007 COSMIC Software
Tutorial Introduction
25
2
Generating Automatic Data Initialization
or
# demoinit.lkf: link command with automatic init
+seg .text -b 0xf000 -n .text # program start address
+seg .const -a .text
# constant follow
+seg .bsct -b 0x0 -m 0x100
# zpage start address
+seg .data -b0x100
# data start address
\cx32\lib\crtsi.sm8
# startup with auto-init
acia.o
# main program
module1.o
# module program
+seg .text -b0xf800 -it
# sets the section attribute
module2.o
# module program
module3.o
# module program
\cx32\lib\libis.sm8
# C library (if needed)
\cx32\lib\libm.sm8
# machine library
+seg .vector -b 0x8000
# vectors start address
vector.o
# interrupt vectors
# define these symbols if crtsi is used
+def __endzp=@.ubsct
# end of uninitialized zpage
+def __memory=@.bss
# end of bss segment
In the first case, the initialized data will be located after the first code
segment. In the second case, the -it option instructs the linker to locate
the initialized data after the segment marked with this flag. The initialized data will be located after the second code segment located at
address 0xf800.
For more information, see “Initializing data in RAM” in Chapter 3 and
“Automatic Data Initialization” in Chapter 6.
26
Tutorial Introduction
© 2007 COSMIC Software
Specifying Command Line Options
Specifying Command Line Options
You specify command line options to cxstm8 to control the compilation
process.
To compile and get a relocatable file, type:
cxstm8 +mods acia.c
The file produced is acia.o.
The -v option instructs the compiler driver to echo the name and options
of each program it calls. The -l option instructs the compiler driver to
create a mixed listing of C code and assembly language code in the file
acia.ls.
To perform the operations described above, enter the command:
cxstm8 +mods -v -l acia.c
When the compiler exits, the following files are left in your current
directory:
•
the C source file acia.c
•
the C and assembly language listing acia.ls
•
the object module acia.o
It is possible to locate listings and object files in specified directories if
they are different from the current one, by using respectively the -cl and
-co options:
cxstm8 +mods -cl\mylist -co\myobj -l acia.c
This command will compile the acia.c file, create a listing named
acia.ls in the \mylist directory and an object file named acia.o in the
\myobj directory.
© 2007 COSMIC Software
Tutorial Introduction
27
2
Specifying Command Line Options
cxstm8 allows you to compile more than one file. The input files can be
C source files or assembly source files. You can also mix all of these
files.
If your application is composed with the following files: two C source
files and one assembly source file, you would type:
cxstm8 +mods -v start.s acia.c getchar.c
This command will assemble the start.s file, and compile the two C
source files.
See “Compiler Command Line Options” in Chapter 4 for information
on these and other command line options.
28
Tutorial Introduction
© 2007 COSMIC Software
CHAPTER
3
Programming
Environments
This chapter explains how to use the COSMIC program development
system to perform special tasks required by various STM8 applications.
© 2007 COSMIC Software
Programming Environments
29
3
Introduction
Introduction
This chapter provides details about:
30
•
Modifying the Runtime Startup
•
Initializing data in RAM
•
Memory Models for code smaller than 64K
•
Memory Models for code larger than 64K
•
Handling Large Code and Constants
•
Bit Variables
•
The const and volatile Type Qualifiers
•
Performing Input/Output in C
•
Referencing Absolute Addresses
•
Accessing Internal Registers
•
Placing Data Objects in The Bss Section
•
Placing Data Objects in Short Range Memory
•
Placing Data Objects in Long Range Memory
•
Placing Data Objects in the EEPROM Space
•
Redefining Sections
•
Inserting Inline Assembly Instructions
•
Writing Interrupt Handlers
•
Placing Addresses in Interrupt Vectors
•
Inline Function
•
Interfacing C to Assembly Language
Programming Environments
© 2007 COSMIC Software
Introduction
•
Register Usage
•
Data Representation
© 2007 COSMIC Software
Programming Environments
31
3
Modifying the Runtime Startup
Modifying the Runtime Startup
The runtime startup module performs many important functions to
establish a runtime environment for C. The runtime startup file included
with the standard distribution provides the following:
•
Initialization of the bss section if any,
•
ROM into RAM copy if required,
•
Initialization of the stack pointer,
•
f_main or other program entry point call, and
•
An exit sequence to return from the C environment. Most users
must modify the exit sequence provided to meet the needs of their
specific execution environment.
The following is a listing of the standard runtime startup file crts.sm8
included on your distribution media. It does not perform automatic data
initialization. The runtime startup file can be placed anywhere in memory. Usually, the startup will be “linked” with the RESET interrupt, and
the startup file may be at any convenient location.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
32
;
;
;
;
C STARTUP FOR STM8
WITHOUT ANY DATA INITIALIZATION
Copyright (c) 2006 by COSMIC Software
xref
xdef
;
;
;
f_main, __stack
f_exit, __stext, f__stext
startup routine from reset vector
switch .text
__stext:
f__stext:
;
; initialize stack pointer
;
ldw
x,#__stack ; stack pointer
ldw
sp,x
; in place
;
; execute main() function
; may be called by a 'jpf' instruction if no return
Programming Environments
© 2007 COSMIC Software
Modifying the Runtime Startup
expected
21 ;
22
callf f_main
23 f_exit:
24
jra
f_exit
25 ;
26
end
; execute main
; and stay here
Description of Runtime Startup Code
f_main is the entry point into the user C program.
Line 15 resets the stack pointer.
Line 22 calls main() in the user's C program.
Lines 23 to 24 trap a return from main(). If your application must return
to a monitor, for example, you must modify this line.
© 2007 COSMIC Software
Programming Environments
33
3
Initializing data in RAM
Initializing data in RAM
If you have initialized static variables, which are located in RAM, you
need to perform their initialization before you start your C program.
The clnk linker will take care of that: it moves the initialized data segments after the first text segment, or the one you have selected with the
-it option, and creates a descriptor giving the starting address, destination and size of each segment.
The table thus created and the copy of the RAM are located in ROM by
the linker, and used to do the initialization. An example of how to do
this is provided in the crtsi.s file, located in the headers sub-directory.
;
;
;
;
C STARTUP FOR STM8
WITH AUTOMATIC DATA INITIALISATION
Copyright (c) 2006 by COSMIC Software
xref f_main, __memory, __idesc__, __stack
xref.b c_x, c_y, __endzp
xdef f_exit, __stext, f__stext
;
;
;
start address of zpage
switch .ubsct
__suzp:
;
;
start address of bss
;
switch .bss
__sbss:
;
;
startup routine from reset vector
;
switch.text
__stext:
f__stext:
;
;
initialize stack pointer
;
ldw
x,#__stack ; stack pointer
ldw
sp,x
; in place
;
;
setup initialized data
;
ldw
y,__idesc__ ; data start address
34
Programming Environments
© 2007 COSMIC Software
Initializing data in RAM
ldw
x,#__idesc__+2
; descriptor address
ld
jreq
bcp
jreq
ldw
ldw
ldw
ldw
ldw
a,(x)
zero
a,#$60
qbcl
c_x,x
x,(3,x)
c_y,x
x,c_x
x,(1,x)
;
;
;
;
;
;
;
;
;
test flag byte
no more segment
test for moveable code segment
yes, skip it
save pointer
move end address
in memory
reload pointer
start address
ld
ld
incw
incw
cpw
jrne
ldw
a,(y)
(x),a
x
y
y,c_y
dbcl
x,c_x
;
;
;
;
;
;
;
transfer
byte
increment
pointers
last byte ?
no, loop again
reload pointer
addw
jra
x,#5
ibcl
; next descriptor
; and loop
ibcl:
dbcl:
qbcl:
;
;
reset
;
zero:
ldw
jra
zbcl:
ld
incw
loop:
cpw
jrne
;
;
reset
;
ldw
jra
bbcl:
ld
incw
ok:
cpw
jrne
;
uninitialized data in zero page
x,#__suzp
loop
; start of uninitialized zpage
; test segment end first
(x),a
x
; clear byte
; next byte
x,#__endzp
zbcl
; end of zpage
; no, continue
uninitialized data in bss
x,#__sbss
ok
; start address
; test segment end first
(x),a
x
; clear byte
; next byte
x,#__memory ; compare end
bbcl
; not equal, continue
© 2007 COSMIC Software
Programming Environments
35
3
Initializing data in RAM
;
execute main() function
;
may be called by a 'jpf' instruction if no return
expected
;
callf f_main
; execute main
f_exit:
jra
f_exit
; and stay here
;
end
crtsi.s performs the same function as described with the crts.s, but with
one additional step. Lines (marked in bold) in crtsi.s include code to
copy the contents of initialized static data, which has been placed in the
text section by the linker, to the desired location in RAM.
The compiler is provided with several startup files implementing the
automatic data initialization depending on the range of variables to be
initialized and the range of the initialization table:
Startup
Initialize
From Table in
crtsi.s
@near
@near
crtsx.s
@near and @far
@near
crtsif.s
@near
@far
crtsxf.s
@near and @far
@far
For more information, see “Generating Automatic Data Initialization”
in Chapter 2 and “Automatic Data Initialization” in Chapter 6.
36
Programming Environments
© 2007 COSMIC Software
Memory Models for code smaller than 64K
Memory Models for code smaller than 64K
The STM8 compiler supports two memory models for application
smaller than 64K, allowing you to choose the most efficient behavior
depending on your processor configuration and your application. All
these models handle code smaller than 64K and then function pointers
are defaulted to @near pointers (2 bytes). Data pointers are defaulted
to @near pointers (2 bytes). The supported models are:
•
Stack Short (mods0) stack is physically in long range and global
variables are defaulted to short range. Any global object in long
range will have to be accessed explicitly with the @near modifier
unless accessed through a pointer.
•
Stack Long (modsl0) stack is physically in long range and global
variables are also defaulted to long range. Any object in long range
will have to be accessed explicitly with the @tiny modifier.
The following table shows for each model how and where the stack is
implemented, how globals are defaulted and how pointers are defaulted.
Models
Stack
Globals
Stack Short
Physical in Long Range
Zero Page
Stack Long
Physical in Long Range
Long Range
The physical stack is implemented in the long range and its value is set
by the symbol __stack in the linker file, if you use the run time setup
files provided with the compiler. The user must insure that the stack and
the variables do not overlap at run time.
The choice of the appropriate model for a given application should be
driven by the amount of globals and locals compared with the available
space in memory. Zero Page variables are more efficient than Long
Range variables but the Zero Page size is limited to 256 bytes.
NOTE
When using a model for application smaller than 64K, you must link with
the specific set of libraries (names ending with ‘0’).
© 2007 COSMIC Software
Programming Environments
37
3
Memory Models for code larger than 64K
Memory Models for code larger than 64K
The STM8 compiler supports two memory models for application
larger than 64K, allowing you to choose the most efficient behavior
depending on your processor configuration and your application. All
these models allow the code to be larger than 64K and then function
pointers are defaulted to @far pointers (3 bytes). Data pointers are
defaulted to @near pointers (2 bytes) unless explicitly declared with
the @far modifier. The supported models are:
•
Stack Short (mods) stack is physically in long range and global
variables are defaulted to short range. Any global object in long
range will have to be accessed explicitly with the @near modifier
unless accessed through a pointer.
•
Stack Long (modsl) stack is physically in long range and global
variables are also defaulted to long range. Any object in long range
will have to be accessed explicitly with the @tiny modifier.
The following table shows for each model how and where the stack is
implemented, how globals are defaulted and how pointers are defaulted.
Models
Stack
Globals
Stack Short
Physical in Long Range
Zero Page
Stack Long
Physical in Long Range
Long Range
The physical stack is implemented in the long range and its value is set
by the symbol __stack in the linker file, if you use the run time setup
files provided with the compiler. The user must insure that the stack and
the variables do not overlap at run time.
The choice of the appropriate model for a given application should be
driven by the amount of globals and locals compared with the available
space in memory. Zero Page variables are more efficient than Long
Range variables but the Zero Page size is limited to 256 bytes.
38
Programming Environments
© 2007 COSMIC Software
Handling Large Code and Constants
Handling Large Code and Constants
The STM8 addresses more than 64K of code, dividing the total space in
64K large sections. The compiler allows by default functions to be as
large as needed and to be allocated anywhere in the total space, regardless of any sections boundary crossing. Interrupt functions need to be
located in the first section. The assembly name of functions allocated
anywhere, implicitly declared as @far functions, is prefixed with the
sequence “f_”, the function beeing called by a callf instruction and
ended with a retf instruction, while the name of functions declared
explicitly as @near functions is prefixed with a single “_”, the function
beeing called by a call instruction and ended with a ret instruction.
Such @near functions must be completely located inside the same section and called only by functions located in the same section. Unless
trying to optimize the code space, the @near modifier should be
restricted to interrupt functions. Such a difference in the function names
allows the linker to check that @far and @near functions are called
properly, any mixing beeing forbidden as the stack display would not
be the same.
In order to allow large functions to cross section boundaries, the compiler has to use the far jump instruction jpf for any unconditional jump
inside the function when the range is too large for a jra instruction. This
makes the code larger even if such a function is not actually crossing a
section boundary. It is possible to force the compiler using the jp
instruction on any function by using the -gnc option. Such functions
may still be @far or @near but cannot be larger than 64K and cannot
be allocated across section. Such functions and @near functions are
checked by the linker in order to verify this constraint.
Constants and literals are normally produced in the .const section
which must be located in the first section. Large constants may be
declared with an @far modifier. In such a case, they are produced in a
.fconst section which may be located anywhere. Although the far space
is used for code and constants, the compiler allows variables to be
declared with the @far modifier. Such variables are allocated in a
.fdata section which may be located anywhere.
© 2007 COSMIC Software
Programming Environments
39
3
Bit Variables
Bit Variables
The C compiler implements bit variables using the _Bool type name as
defined by the new ANSI/ISO standard C99 (also referenced as C9X).
A _Bool variable is a boolean object which only contains the values
true and false. They are implemented on single bits with value 1 for
true and 0 for false. When assigning an expression to a _Bool variable,
the compiler compares the expression against zero and assigns the
boolean result to the boolean variable. So, any integer, real or pointer
expression can be assigned to a boolean variable. It is not possible to
declare arrays of booleans nor pointers to booleans, but booleans can be
used as structure or union fields. Consecutive _Bool fields will be
packed in bytes.
The compiler packs global _Bool variables in bytes using a bit section
named .bit which needs to be allocated in the zero page in order to
allow and efficient handling using the bit instructions. Local _Bool variables are also packed in bytes regardless of the memory model. _Bool
arguments are passed widened to a single byte.
_Bool in_range;
_Bool p_valid;
char *ptr;
in_range = (value >= 10) && (value <= 20);
p_valid = ptr;
/* p_valid is true if ptr not 0 */
if (p_valid && in_range)
*ptr = value;
40
Programming Environments
© 2007 COSMIC Software
The const and volatile Type Qualifiers
The const and volatile Type Qualifiers
You can add the type qualifiers const and volatile to any base type or
pointer type attribute.
Volatile types are useful for declaring data objects that appear to be in
conventional storage but are actually represented in machine registers
with special properties. You use the type qualifier volatile to declare
memory mapped input/output control registers, shared data objects, and
data objects accessed by signal handlers. The compiler will not optimize references to volatile data.
An expression that stores a value in a data object of volatile type stores
the value immediately. An expression that accesses a value in a data
object of volatile type obtains the stored value for each access. Your
program will not reuse the value accessed earlier from a data object of
volatile type.
NOTE
The volatile keyword must be used for any data object (variables) that
can be modified outside of the normal flow of the function. Without the
volatile keyword, all data objects are subject to normal redundant code
removal optimizations. Volatile MUST be used for the following conditions:
1) All data objects or variables associated with a memory mapped hardware register e.g. volatile char DDRB @0x05;
2) All global variable that can be modified (written to) by an interrupt
service routine either directly or indirectly. e.g. a global variable used as
a counter in an interrupt service routine.
You use const to declare data objects whose stored values you do not
intend to alter during execution of your program. You can therefore
place data objects of const type in ROM or in write protected program
segments. The cross compiler generates an error message if it encounters an expression that alters the value stored in a const data object.
© 2007 COSMIC Software
Programming Environments
41
3
The const and volatile Type Qualifiers
If you declare a static data object of const type at either file level or at
block level, you may specify its stored value by writing a data initializer. The compiler determines its stored value from its data initializer
before program startup, and the stored value continues to exist
unchanged until program termination. If you specify no data initializer,
the stored value is zero. If you declare a data object of const type at
argument level, you tell the compiler that your program will not alter
the value stored in that argument in the related function. If you declare a
data object of const type and dynamic lifetime at block level, you must
specify its stored value by writing a data initializer. If you specify no
data initializer, the stored value is undefined.
The const keyword implies the @near memory space to allow such a
variable to be located in the code space. If a memory space modifier is
explicitly given on a declaration using the const keyword, the compiler
uses the given space instead of the default one, meaning that the object
may not be located in the code space depending on the memory space
given. In such a case, the const keyword still enforces the assignment
checking.
You may specify const and volatile together, in either order. A const
volatile data object could be a Read-only status register, or a status variable whose value may be set by another program.
Examples of data objects declared with type qualifiers are:
char * const x;
/* const pointer to char */
int * volatile y;
/* volatile pointer to int */
const float pi = 355.0 / 113.0; /* pi is never changed */
42
Programming Environments
© 2007 COSMIC Software
Performing Input/Output in C
Performing Input/Output in C
You perform input and output in C by using the C library functions
getchar, gets, printf, putchar, puts and sprintf. They are described in
chapter 4.
The C source code for these and all other C library functions is included
with the distribution, so that you can modify them to meet your specific
needs. Note that all input/output performed by C library functions is
supported by underlying calls to getchar and putchar. These two functions provide access to all input/output library functions. The library is
built in such a way so that you need only modify getchar and putchar,
the rest of the library is independent of the runtime environment.
Function definitions for getchar and putchar are:
char getchar(void);
char putchar(char c);
+
© 2007 COSMIC Software
Programming Environments
43
3
Referencing Absolute Addresses
Referencing Absolute Addresses
This C compiler allows you to read from and write to absolute
addresses, and to assign an absolute address to a function entry point or
to a data object. You can give a memory location a symbolic name and
associated type, and use it as you would do with any C identifier. This
feature is usefull for accessing memory mapped I/O ports or for calling
functions at known addresses in ROM.
References to absolute addresses have the general form @,
where is a valid memory location in your environment. For
example, to associate an I/O port at address 0x20 with the identifier
name ttystat, write a definition of the form:
char MISCR1 @0x20;
where @0x20 indicates an absolute address specification and not a data
initializer. Since input/output on the STM8 architecture is memory
mapped, performing I/O in this way is equivalent to writing in any
given location in memory.
Such a declaration does not reserve any space in memory. The compiler
still creates a label, using an equate definition, in order to reference the
C object symbolically. This symbol is made public to allow external
usage from any other file.
Individual bits can also be declared as _Bool objects by adding a bit
number to the address using the syntax @:, where
is a byte memory location and a bit number
expressed by a constant value (or expression) between 0 and 7. For
example, to define bit 3 of memory byte at 0x01 as PB3:
_Bool PB3 @0x01:3;
To use the I/O port in your application, write:
char c;
c = MISCR1; /* to read from input port */
MISCR1 = c; /* to write to output port */
44
Programming Environments
© 2007 COSMIC Software
Referencing Absolute Addresses
Another solutions is to use a #define directive with a cast to the type of
the object being accessed, such as:
#define MISCR1 *(char *)0x20
which is both inelegant and confusing. The COSMIC implementation is
more efficient and easier to use, at the cost of a slight loss in portability.
Note that COSMIC C does support the pointer and #define methods of
implementing I/O access.
Another example of how to reference a direct memory address, defines
a structure at absolute address 0x6000:
struct acia
{
char status;
char data;
} acia @0x6000
Using this declaration, references to acia.status will refer to memory location 0x6000 and acia.data will refer to memory location
0x6001. This is very useful if you are building your own custom I/O
hardware that must reside at some location in the STM8 memory map.
© 2007 COSMIC Software
Programming Environments
45
3
Accessing Internal Registers
Accessing Internal Registers
All registers are declared in io*.h files provided with the compiler, each
one dedicated to a specific processor. One of these files should be
included in each file using the input-output registers, for example by a:
#include
All the register names are defined by assembly equates which are made
public. This allows any assembler source to use directly the input-output register names by defining them with an xref directive. All those
definitions are already provided in a io*.s file which may be included in
an assembly source by a:
include "io75f51x.s"
Note that the compiler will access to these registers as standard variables. In some case of reading or writing some “int” registers, you should
declare an union (with two char and one int) instead of using directly
the I/O register.
46
Programming Environments
© 2007 COSMIC Software
Placing Data Objects in The Bss Section
Placing Data Objects in The Bss Section
The compiler automatically reserves space for uninitialized data object.
All such data are placed in the .bss section. All initialized static data are
placed in the .data section. The bss section is located, by default, after
the data section by the linker.
The run-time startup files, crtsi.s and crtsi.s, contain code which initializes the bss section space to zero.
The compiler provides a special option, +nobss, which forces uninitialized data to be explicitly located in the .data section. In such a case,
these variables are considered as being explicitly initialized to zero.
© 2007 COSMIC Software
Programming Environments
47
3
Placing Data Objects in Short Range Memory
Placing Data Objects in Short Range Memory
The Stack Short model allocates global variables by default in short
range memory. Such variables are located into the section .bsct if they
are initialized, or in the section .ubsct otherwise. An external object
name is published via a xref.b declaration at the assembly language
level. A variable can be explicitly allocated in zero page by using the
@tiny modifier:
@tiny char c;
To place data objects into short range memory on a file basis, if not yet
selected the memory model, you can use the #pragma directive of the
compiler:
#pragma space extern [] @tiny
instructs the compiler to place all data objects of storage class extern or
static into short range memory for the current unit of compilation (usually a file). The section must end with a #pragma space extern []
@near to revert to the default compiler behaviour.
NOTE
The code generator does not check for zero page overflow.
Setting Zero Page Size
You can set the size of the zero page section of your object image at link
time by specifying the following options on the linker command line:
+seg .bsct -m##
where ## represents the size of the zero page section in bytes. Note that
the size of the zero page section can never exceed 256 bytes.
48
Programming Environments
© 2007 COSMIC Software
Placing Data Objects in Long Range Memory
Placing Data Objects in Long Range Memory
The Stack Long model allocates global variables by default in long
range memory. Such variables will be located into the .data section if
they are initialized, or in the .bss section otherwise. An external object
name is published via a xref declaration at the assembly language level.
A variable can be explicitly allocated in Long Range memory by using
the @near modifier. The following declaration:
@near char ext;
instructs the compiler to locate the variable ext in the long range memory.
To place data objects into long range memory on a file basis, if not yet
selected by the memory model, you can use the #pragma directive of
the compiler:
#pragma space extern [] @near
instructs the compiler to place all data objects of storage class extern or
static into Long Range memory for the current unit of compilation (usually a file).
The section must end with a #pragma space extern [] @tiny to revert
to the default compiler behaviour.
© 2007 COSMIC Software
Programming Environments
49
3
Placing Data Objects in the EEPROM Space
Placing Data Objects in the EEPROM Space
The compiler allows the use to define a variable as an eeprom location,
using the type qualifier @eeprom. This causes the compiler to produce
special code when such a variable is modified. When the compiler
detects a write to an eeprom location, it calls a machine library function
which performs the actual write. An example of such a definition is:
@eeprom char var;
To place all data objects from a file into eeprom, you can use the
#pragma directive of the compiler:
#pragma space extern [] @eeprom @near
instructs the compiler to treat all extern and static data in the current file
as eeprom locations. The @near modifier is necessary because the eeprom is located outside the zero page.
The section must end with a #pragma space extern [] @near or
@tiny, depending on the memory model selected.
The compiler allocates @eeprom variables in a separate section named
.eeprom, which will be located at link time.
The linker directive:
seg .eeprom -b0xb600 -m512
var_eeprom.o
will create a segment located at address 0xb600, with a maximum size
of 512 bytes.
NOTE
The code generator cannot check if data address will be eeprom
addresses after linkage.
50
Programming Environments
© 2007 COSMIC Software
Redefining Sections
Redefining Sections
The compiler uses by default predefined sections to output the various
component of a C program. The default sections are:
Section
Description
.text
executable code
.const
text string and constants
.fconst
large constant variables (@far)
.data
initialized variables (@near)
.bss
uninitialized variables (@near)
.bsct
initialized variables in zero page (@tiny by default)
.ubsct
uninitialized variables in zero page (@tiny by default)
.fdata
large variables (@far)
.eeprom
any variable in eeprom (@eeprom)
.bit
bit variables in the zero page
It is possible to redirect any of these components to any user defined
section by using the following pragma definition:
#pragma section
where is either empty or one of the following sequences:
const
_Bool
@tiny
@near
@far
@eeprom
and is a section name enclosed as follows:
(name) - parenthesis indicating a code section
[name] - square brackets indicating uninitialized data
{name} - curly braces indicating initialized data
© 2007 COSMIC Software
Programming Environments
51
3
Redefining Sections
A section name is a plain C identifier which does not begin with a dot
character, and which is no longer than 13 characters. The compiler will
prefix automatically the section name with a dot character when passing
this information to the assembler. It is possible to switch back to the
default sections by omitting the section name in the
sequence.
Each pragma directive starts redirecting the selected component from
the next declarations. Redefining the bss section forces the compiler to
produce the memory definitions for all the previous bss declarations
before to switch to the new section.
The following directives:
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
section
section
section
section
section
section
section
section
(code)
const {string}
@near [udata]
@near {idata}
@tiny [uzpage]
@tiny {izpage}
@eeprom @near {e2prom}
_Bool {bdata}
redefine the default sections (or the previous one) as following:
- executable code is redirected to section .code
- strings and constants are redirected to section .string
- uninitialized variables are redirected to section .udata
- initialized data are redirected to section .idata
- uninitialized zpage variables are redirected to section .uzpage
- initialized zpage variables are redirected to section .izpage
- eeprom variables are redirected to section .e2prom
- bit variables are redirected to section .bdata
Note that {name} and [name] are equivalent for constant and eeprom
sections as they are all considered as initialized.
The following directive:
#pragma section ()
switches back the code section to the default section .text.
52
Programming Environments
© 2007 COSMIC Software
Inserting Inline Assembly Instructions
Inserting Inline Assembly Instructions
The compiler features two ways to insert assembly instructions in a C
file. The first method uses #pragma directives to enclose assembly
instructions. The second method uses a special function call to insert
assembly instructions. The first one is more convenient for large
sequences but does not provide any connection with C object. The second one is more convenient to interface with C objects but is more limited regarding the code length.
Inlining with pragmas
The compiler accepts the following pragma sequences to start and finish assembly instruction blocks:
Directive
Description
#pragma asm
start assembler block
#pragma endasm
end assembler block
The compiler also accepts shorter sequences with the same meaning:
Directive
Description
#asm
start assembler block
#endasm
end assembler block
Such an assembler block may be located anywhere, inside or outside a
function. Outside a function, it behaves syntactically as a declaration.
This means that such an assembler block cannot split a C declaration
somewhere in the middle. Inside a function, it behaves syntactically as
one C instruction. This means that there is no trailing semicolon at the
end, and no need for enclosing braces. It also means that such an assembler block cannot split a C instruction or expression somewhere in the
middle.
The following example shows a correct syntax:
© 2007 COSMIC Software
Programming Environments
53
3
Inserting Inline Assembly Instructions
#pragma asm
xref asmvar
#pragma endasm
extern char test;
void func(void)
{
if (test)
#asm
/* no need for { */
scf
; set carry bit
rlc asmvar; access assembler variable
#endasm
else
test = 1;
}
Inlining with _asm
The _asm() function inserts inline assembly code in your C program.
The syntax is:
_asm(“string constant”, arguments...);
The “string constant” argument is the assembly code you want embedded in your C program. “arguments” follow the standard C rules for
passing arguments. The string you specify follows standard C rules. For
example, carriage returns can be denoted by the ‘\n’ character.
For example, to produce the following assembly sequence:
ldw x,sp
callf f_main
you would write
_asm(“ldw x,sp\n callf f_main\n”);
The ‘\n’ character is used to separate the instructions when writing multiple instructions in the same line.
54
Programming Environments
© 2007 COSMIC Software
Inserting Inline Assembly Instructions
NOTE
The argument string must be shorter than 255 characters. If you wish to
insert longer assembly code strings you will have to split your input
among consecutive calls to _asm().
_asm() does not perform any checks on its argument string. Only the
assembler can detect errors in code passed as argument to an _asm()
call.
_asm() can be used in expressions, if the code produced by _asm complies with the rules for function returns. For example:
var = _asm(“sra a\n rlc a\n rlc a\n”, var);
allows to rotate the variable var passed as argument in the a register,
and store the result in the same variable. The variable var is supposed to
be declared as a char, and is loaded in the a register because it is considered as a first argument. The result is expected in the a register in order
to comply with the return register convention, as described below.
NOTE
With both methods, the assembler source is added as is to the code during the compilation. The optimizer does not modify the specified instructions, unless the -a option is specified on the code generator. The
assembler input can use lowercase or uppercase mnemonics, and may
include assembler comments.
By default, _asm() is returning an int as any undeclared function. To
avoid the need of several definitions (usually conflictuous) when
_asm() is used with different return types, the compiler implements a
special behaviour when a cast is applied to _asm(). In such a case, the
cast is considered to define the return type of _asm() instead of asking
for a type conversion. There is no need for any prototype for the _asm()
function as the parser verifies that the first argument is a string constant.
© 2007 COSMIC Software
Programming Environments
55
3
Inserting Inline Assembly Instructions
Inlining Labels
When labels are necessary in the inlined assembly code, the compiler
provides a special syntax allowing local labels to be created and handled without interaction with other labels and the optimizer. The
sequence $N in the assembly source is replaced by a new label name
while the sequence $L is replaced by the label name created by the last
$N. Using this syntax, a simple wait loop may be entered as follow:
#asm
ld
a,#7
$N:
dec a
jrne $L
#endasm
56
Programming Environments
; loop on the previous label
© 2007 COSMIC Software
Writing Interrupt Handlers
Writing Interrupt Handlers
A function declared with the type qualifier @interrupt is suitable for
direct connection to an interrupt (hardware or software). @interrupt
functions may not return a value. @interrupt functions are allowed to
have arguments, although hardware generated interrupts are not likely
to supply anything meaningful.
When you define an @interrupt function, the compiler uses the “iret”
instruction for the return sequence, and saves, if necessary, the y register and the memory bytes used by the compiler for its internal usage.
Those areas are c_x (3 bytes), c_y (3 bytes) and c_lreg (4 bytes). Those
bytes will be saved and restored if the interrupt function uses them
directly. If the interrupt function does not uses these areas directly, but
calls another C function, the c_x and c_y areas will be automatically
saved and restored, unless using the type qualifier @nosvf on the interrupt function definition. This qualifier can be used when the called
functions are known not using those areas, but the compiler does not
perform any verification. The c_lreg area is not saved implicitly in such
a case, in order to keep the interrupt function as efficient as possible. If
any function called by the interrupt function uses longs or floats, the
c_lreg area can be saved by using the type qualifier @svlreg on the
interrupt function definition. Whatever the model used is, these copies
are made directly on the stack.
Because the STM8 allows several levels of interrupts, the compiler by
default enforces a stack model for the interrupt function.
The STM8 architecture forces any interrupt function to be located in the
first 64K. The interrupt vector table containing 2-byte addresses, interrupt functions declared in C must be declared with the @near modifier
if the vector table is also written in C.
You define an @interrupt function by using the type qualifier @interrupt to qualify the type returned by the function you declare. An example of such a definition is:
© 2007 COSMIC Software
Programming Environments
57
3
Writing Interrupt Handlers
@interrupt @near void it_handler(void)
{
...
}
NOTE
The @interrupt modifier is an extension to the ANSI standard.
58
Programming Environments
© 2007 COSMIC Software
Placing Addresses in Interrupt Vectors
Placing Addresses in Interrupt Vectors
You may use either an assembly language program or a C program to
place the addresses of interrupt handlers in interrupt vectors. The
assembly language program would be similar to the following example:
switch .text
xref handler1, handler2, handler3
vector1:dc.w handler1
vector2:dc.w handler2
vector3:dc.w handler3
end
where handler1 and so forth are interrupt handlers.
A small C routine that performs the same operation is:
extern @near void handler1(), handler2(), handler3();
@near void (* const vector[])() =
{
handler1,
handler2,
handler3,
};
where handler1 and so forth are interrupt handlers. Then, at link time,
include the following options on the link line:
+seg .const -b0x8000 vector.o
where vector.o is the file which contains the vector table. This file is
provided in the compiler package.
© 2007 COSMIC Software
Programming Environments
59
3
Inline Function
Inline Function
The compiler is able to inline a function body instead of producing a
function call. This feature allows the program to run faster but produces
a larger code. A function to be inlined has to be defined with the
@inline modifier. Such a function is kept by the compiler and does not
produced any code yet. Each time this function is called in the same
source file, the call is replaced by the full body of the inlined function.
Because inlined functions are in fact local to a source file, they should
be defined in a header file if they have to be used by several source
files. To allow the arguments to be passed properly, inlined functions
must be defined with prototypes.
NOTE
Inline functions cannot declare static local variables and cannot call
themselves either directly or indirectly.
The compiler allows access to specific instructions or features of the
STM8 processor, using @inline functions. Such functions shall be
declared as external functions with the @inline modifier. The compiler
recognizes three predefined functions when explicitly declared as follows:
@inline char carry(void);
@inline char irq(void);
@inline char imask(void);
60
carry
the carry function is used to test or get the carry bit from
the condition register. If the carry function is used in a
test, the compiler produces a jnrc or jrc instruction. If
the carry function is used in any other expression, the
compiler produces a code sequence setting the a register to 0 or 1 depending on the carry bit value.
irq
the irq function is used to test the interrupt line level
using the jrih or jril instruction. The irq function can be
used only in a test
imask
the imask function is used to test the interrupt mask bit
in the condition register using the jrm or jrnm instruction. The imask function can be used only in a test.
Programming Environments
© 2007 COSMIC Software
Inline Function
These functions are predeclared in the processor.h header file. A full
description with examples is provided in Chapter 4.
Any other function declared as an @inline will be translated into a call
to a user provided macro. The macro name is obtained by prefixing the
@inline function name with the ‘_’ character. Arguments are allowed
but should be restricted to variable references. Each reference is translated into the proper assembler expression (same translation as applied
by the compiler) and then passed to the macro as a quoted text string.
@inline functions may use the registers a and/or x, but the compiler can
not check their use and will not save them. To save the registers before
they are used by @inline functions, you must add the @usea and/or the
@usex modifiers.
For example:
@inline @usea lsub();
tells the compiler that lsub() uses the register a, so that the compiler will
save it. If both registers are used, you must specify both modifiers.
© 2007 COSMIC Software
Programming Environments
61
3
Interfacing C to Assembly Language
Interfacing C to Assembly Language
The C cross compiler translates C programs into assembly language
according to the specifications described in this section.
You may write external identifiers in both uppercase and lowercase.
The compiler prepends an underscore ‘_’ character to each identifier. If
the identifier is the name of an @far function, the compiler prepends a
‘f’ character to the extra underscore.
The compiler places function code in the .text section. Function code is
not to be altered or read as data. External function names are published
via xdef declarations.
Literal data such as strings, float or long constants, and switch tables,
are normally generated into the .const section. An option on the code
generator allows such constants to be produced in the .text section.
Const variables declared with the @far modifier are published in the
.fconst section.
The compiler generates initialized data declared with the @near modifier into the .data section. Such external data names are published via
xref declarations. Data you declare to be of “const” type by adding the
type qualifier const to its base type is normally generated into the .const
section. Initialized data declared with the @tiny space modifier will be
generated into the .bsct section. Such external data names are published
via xref.b declarations. Uninitialized data are normally generated into
the .bss section for @near variables or the .ubsct section for @tiny
variables, unless forced to the .data or .bsct section by the compiler
option +nobss. Variables declared with the @far modifier are published in the .fdata section. _Bool data is generated in the .bit section
and external names are published via xbit.b declarations.
62
Section
Declaration
Reference
.bsct
@tiny char i =2;
xdef
.ubsct
@tiny char i;
xdef
.data
int init = 1
xdef
.bss
int uninit
xdef
Programming Environments
© 2007 COSMIC Software
Interfacing C to Assembly Language
Section
Declaration
Reference
.text
char putchar(c);
xdef
.const
const char c = 1;
xdef
.fconst
@far const char c = 1;
xdef
.fdata
@far char i;
xdef
.bit
_Bool Pb3;
xdef
Any of above
extern int out;
xref, xbit
Function calls are performed according to the following:
1) Arguments are evaluated from right to left. The first argument is
stored in the a register if it is a char or a @tiny pointer, or in the x
register if its type is short, int or @near pointer, and if the function
does not return a structure larger than 2 bytes. Other arguments are
pushed to the stack if a Stack model is selected, or stored in memory otherwise.
2) The function is called via a callf f_func instruction.
3) Stacked arguments are cleaned out if a Stack model is selected.
© 2007 COSMIC Software
Programming Environments
63
3
Register Usage
Register Usage
Except for the return value, the registers a, x, y and the condition codes
are undefined on return from a function call. The return value is in a if it
is of type char, @tiny pointer or a one byte structure, x if it is of type
short, integer, @near pointer or a two byte structure. The return value
is in the memory located at symbol c_lreg if it is of type long or float.
The return value is in the memory location c_x (two upper bytes) and
the x register (lower byte) if it is of type @far pointer.
The first argument may be hold in register, and will be stored at the
function entry. Such a function declaration:
int func(int arg1, int arg2, int arg3)
will create the following memory area:
locals
arg1
return address
arg2
arg3
Stack pointer
64
Programming Environments
© 2007 COSMIC Software
Data Representation
Data Representation
Data objects of type char are stored as one byte. A plain char is
defaulted to type unsigned char.
Data objects of type short int and int are stored as two bytes, more significant byte first.
15
8 7
0
Most Significant Byte
Less Significant Byte
Short Int, Int
Data objects of type long int are stored as four bytes, in descending
order of significance.
31
24 23
16 15
8 7
Most Significant Byte
0
Less Significant Byte
Long
@tiny pointers (short range) are stored as one byte. @near pointers
(long range) are stored as two bytes. @far pointers are stored as three
bytes, in descending order of significance.
23
16 15
8 7
0
Less Significant Byte
Most Significant Byte
@far Pointer
Data objects of type float are represented as for the proposed IEEE
Floating Point Standard; four bytes stored in descending order of significance. The IEEE representation is: most significant bit is one for negative numbers, and zero otherwise; the next eight bits are the
characteristic, biased such that the binary exponent of the number is the
characteristic minus 126; the remaining bits are the fraction, starting
with the weighted bit. If the characteristic is zero, the entire number is
© 2007 COSMIC Software
Programming Environments
65
3
Data Representation
taken as zero, and should be all zeros to avoid confusing some routines
that do not process the entire number. Otherwise there is an assumed 0.5
(assertion of the weighted bit) added to all fractions to put them in the
interval [0.5, 1.0). The value of the number is the fraction, multiplied by
-1 if the sign bit is set, multiplied by 2 raised to the exponent.
31 30
23 22
Sign
Characteristic
0
Mantissa
Float representation
66
Programming Environments
© 2007 COSMIC Software
CHAPTER
4
Using The Compiler
This chapter explains how to use the C cross compiler to compile programs on your host system. It explains how to invoke the compiler, and
describes its options. It also describes the functions which constitute the
C library. This chapter includes the following sections:
•
Invoking the Compiler
•
File Naming Conventions
•
Generating Listings
•
Generating an Error File
•
C Library Support
•
Descriptions of C Library Functions
© 2007 COSMIC Software
Using The Compiler
67
4
Invoking the Compiler
Invoking the Compiler
To invoke the cross compiler, type the command cxstm8, followed by
the compiler options and the name(s) of the file(s) you want to compile.
All the valid compiler options are described in this chapter. Commands
to compile source files have the form:
cxstm8 [options] .[c|s]
cxstm8 is the name of the compiler. The option list is optional. You
must include the name of at least one input file . can be a
C source file with the suffix ‘.c’, or an assembly language source file
with the suffix ‘.s’. You may specify multiple input files with any combination of these suffixes in any order.
If you do not specify any command line options, cxstm8 will compile
your with the default options. It will also write the name of each
file as it is processed. It writes any error messages to STDERR.
The following command line:
cxstm8 +mods acia.c
compiles and assembles the acia.c C program, using the Stack Short
model, creating the relocatable program acia.o.
If the compiler finds an error in your program, it halts compilation.
When an error occurs, the compiler sends an error message to your terminal screen unless the option -e has been specified on the command
line. In this case, all error messages are written to a file whose name is
obtained by replacing the suffix .c of the source file by the suffix .err.
An error message is still output on the terminal screen to indicate that
errors have been found. Appendix A, “Compiler Error Messages” lists
the error messages the compiler generates. If one or more command
line arguments are invalid, cxstm8 processes the next file name on the
command line and begins the compilation process again.
The example command above does not specify any compiler options. In
this case, the compiler will use only default options to compile and
68
Using The Compiler
© 2007 COSMIC Software
Invoking the Compiler
assemble your program. You can change the operation of the compiler
by specifying the options you want when you run the compiler.
To specify options to the compiler, type the appropriate option or
options on the command line as shown in the first example above.
Options should be separated with spaces. You must include the ‘-’ or
‘+’ that is part of the option name.
Compiler Command Line Options
The cxstm8 compiler accepts the following command line options,
each of which is described in detail below:
cxstm8 [options]
-a*> assembler options
-ce* path for errors
-cl* path for listings
-co* path for objects
-d*> define symbol
-e
create error file
-ec all C files
-es all assembler files
-ex* prefix executables
-f* configuration file
-g*> code generator options
-i*> path for include
-l
create listing
-no do not use optimizer
-o*> optimizer options
-p*> parser options
-sm create only dependencies
-s
create only assembler file
-sp create only preprocessor file
-t* path for temporary files
-v
verbose
-x
do not execute
+*> select compiler options
© 2007 COSMIC Software
Using The Compiler
69
4
Invoking the Compiler
Cxstm8 Option Usage
70
Option
Description
-a*>
specify assembler options. Up to 60 options can be specified on the same command line. See Chapter 5, “Using The
Assembler”, for the list of all accepted options.
-ce*
specify a path for the error files. By default, errors are created in the same directory than the source files.
-cl*
specify a path for the listing files. By default, listings are created in the same directory than the source files.
-co*
specify a path for the object files. By default, objects are
created in the same directory than the source files.
-d*^
specify * as the name of a user-defined preprocessor symbol (#define). The form of the definition is
-dsymbol[=value]; the symbol is set to 1 if value is omitted.
You can specify up to 60 such definitions.
-e
log errors from parser in a file instead of displaying them on
the terminal screen. The error file name is defaulted to
.err, and is created only if there are errors.
-ec
treat all files as C source files.
-es
treat all files as assembler source files.
-ex
use the compiler driver’s path as prefix to quickly locate the
executable passes. Default is to use the path variable environment. This method is faster than the default behavior but
reduces the command line length.
-f*
specify * as the name of a configuration file. This file contains a list of options which will be automatically used by the
compiler. If no file name is specified, then the compiler looks
for a default configuration file named cxstm8.cxf in the compiler directory as specified in the installation process. For
more information, see Appendix B, “The Configuration
File”.
-g*>
specify code generation options. Up to 60 options can be
specified. See “The cgstm8 Code Generator” in Appendix
D, for the list of all accepted options.
Using The Compiler
© 2007 COSMIC Software
Invoking the Compiler
Cxstm8 Option Usage (cont.)
Option
Description
-i*>
define include path. You can define up to 128 different
paths. Each path is a directory name, not terminated by any
directory separator character, or a file containing a list of
directory names.
-l
merge C source listing with assembly language code; listing
output defaults to .ls.
-no
do not use the optimizer.
-o*>
specify optimizer options. Up to 60 options can be specified.
See “The costm8 Assembly Language Optimizer” in Appendix D, for the list of all accepted options.
-p*>
specify parser options. Up to 60 options can be specified.
See “The cpstm8 Parser” in Appendix D, for the list of all
accepted options.
-s
create only assembler files and stop. Do not assemble the
files produced.
-sm
create only a list of ‘make’ compatible dependencies consisting for each source file in the object name followed by a
list of header files needed to compile that file.
-sp
create only preprocessed files and stop. Do not compile
files produced. Preprocessed output defaults to .p.
The produced files can be compiled as C source files.
-t*
specify path for temporary files. The path is a directory
name, not terminated by any directory separator character.
-v
be “verbose”. Before executing a command, print the command, along with its arguments, to STDOUT. The default is
to output only the names of each file processed. Each name
is followed by a colon and newline.
-x
do not execute the passes, instead write to STDOUT the
commands which otherwise would have been performed.
© 2007 COSMIC Software
Using The Compiler
71
4
Invoking the Compiler
Cxstm8 Option Usage (cont.)
72
Option
Description
+*>
select a predefined compiler option. These options are predefined in the configuration file. You can specify up to 60
compiler options on the command line. The following documents the available options as provided by the default configuration file
+compact
produce a smaller code but slower than the default behaviour. Smaller code is produced by enabling the optimizer
factorization feature with a default depth of seven instructions.
+debug
produce debug information to be used by the debug utilities
provided with the compiler and by any external debugger.
+mods
select the Stack Short model. Stack is physically in long
range, variables are in short range memory but pointers are
pointing to long range memory. See “Memory Models for
code larger than 64K” in Chapter 3.
+modsl
select the Stack Long mode. Stack is physically in long
range, variables and pointers are in and pointing to long
range memory. See “Memory Models for code larger than
64K” in Chapter 3.
+mods0
select the Stack Short model for application smaller than
64K. Stack is physically in long range, variables are in short
range memory but pointers are pointing to long range memory. See “Memory Models for code smaller than 64K” in
Chapter 3.
+modsl0
select the Stack Long model for application smaller than
64K. Stack is physically in long range, variables and pointers are in and pointing to long range memory. See “Memory
Models for code smaller than 64K” in Chapter 3.
+nobss
do not use the .bss section for variables allocated in external memory. By default, such uninitialized variables are
defined into the .bss section. This option is useful to force
all variables to be grouped into a single section.
+nocst
output literals and constants in the code section .text
instead of the specific section .const.
Using The Compiler
© 2007 COSMIC Software
Invoking the Compiler
Cxstm8 Option Usage (cont.)
Option
Description
+proto
enforce prototype declaration for functions. An error message is issued if a function is used and no prototype declaration is found for it. By default, the compiler accepts both
syntaxes without any error.
+rev
reverse the bitfield filling order. By default, bitfields are filled
from the Less Significant Bit (LSB) towards the Most Significant Bit (MSB) of a memory cell. If the +rev option is specified, bitfields are filled from the msb to the lsb.
+split
create a separate sub-section per function, up to a maximum number of 256 sections, thus allowing the linker to
suppress unused functions if the -k option has been specified on at least one segment in the linker command file. For
objects with more than 256 functions, the functions will be
grouped together to a minimum number of functions per
sub-section to not exceed the maximum number of 256
sub-sections. See “Segment Control Options” in Chapter 6.
+strict
direct the compiler to enforce stronger type checking.
+warn
enable warnings.
© 2007 COSMIC Software
Using The Compiler
73
4
File Naming Conventions
File Naming Conventions
The programs making up the C cross compiler generate the following
output file names, by default. See the documentation on a specific program for information about how to change the default file names
accepted as input or generated as output.
74
Program
Input File Name
Output File Name
cpstm8
.c
.1
cgstm8
.1
.2
costm8
.2
.s
error listing
.c
.err
assembler listing
.[c|s]
.ls
C header files
.h
castm8
.s
.o
source listing
.s
.ls
clnk
.o
name required
chex
STDOUT
clabs
.la
clib
name required
cobj
STDOUT
cv695
.695
cvdwarf
.elf
Using The Compiler
© 2007 COSMIC Software
Generating Listings
Generating Listings
You can generate listings of the output of any (or all) the compiler
passes by specifying the -l option to cxstm8. You can locate the listing
file in a different directory by using the -cl option.
The example program provided in the package shows the listing produced by compiling the C source file acia.c with the -l option:
cxstm8 +mods -l acia.c
Generating an Error File
You can generate a file containing all the error messages output by the
parser by specifying the -e option to cxstm8. You can locate the error
file in a different directory by using the -ce option. For example, you
would type:
cxstm8 +mods -e prog.c
The error file name is obtained from the source filename by replacing
the .c suffix by the .err suffix.
Return Status
cxstm8 returns success if it can process all files successfully. It prints a
message to STDERR and returns failure if there are errors in at least
one processed file.
Examples
To echo the names of each program that the compiler runs:
cxstm8 +mods -v file.c
To save the intermediate files created by the code generator and halt
before the assembler:
cxstm8 +mods -s file.c
© 2007 COSMIC Software
Using The Compiler
75
4
C Library Support
C Library Support
This section describes the facilities provided by the C library. The C
cross compiler for STM8 includes all useful functions for programmers
writing applications for ROM-based systems.
How C Library Functions are Packaged
The functions in the C library are packaged in three separate sub-libraries; one for machine-dependent routines (the machine library), one that
does not support floating point (the integer library) and one that provides full floating point support (the floating point library). If your
application does not perform floating point calculations, you can
decrease its size and increase its runtime efficiency by including only
the integer library.
Inserting Assembler Code Directly
Assembler instructions can be quoted directly into C source files, and
entered unchanged into the output assembly stream, by use of the
_asm() function. This function is not part of any library as it is recognized by the compiler itself. See “Inserting Inline Assembly Instructions” in Chapter 3.
Linking Libraries with Your Program
If your application requires floating point support, you must specify the
floating point library before the integer library in the linker command
file. Modules common to both libraries will therefore be loaded from
the floating point library, followed by the appropriate modules from the
floating point and integer libraries, in that order.
NOTE
When using a model for application smaller than 64K, you must link with
the specific set of libraries (names ending with ‘0’).
Integer Library Functions
The following table lists the C library functions in the integer library.
_asm
checksum
checksum16
checksum16x
76
Using The Compiler
isalpha
iscntrl
isdigit
isgraph
memcmp
memcpy
memmove
memset
strcmp
strcpy
strcspn
strlen
© 2007 COSMIC Software
C Library Support
checksumx
abs
atoi
atol
calloc
div
free
getchar
gets
imask
irq
isalnum
islower
isprint
ispunct
isqrt
isspace
isupper
isxdigit
labs
ldiv
lsqrt
malloc
memchr
printf
putchar
puts
rand
realloc
sbreak
scanf
sprintf
srand
sscanf
strcat
strchr
strncat
strncmp
strncpy
strpbrk
strrchr
strspn
strstr
strtol
tolower
toupper
Floating Point Library Functions
The following table lists the C library functions in the float library.
acos
asin
atan
atan2
atof
ceil
cos
cosh
exp
fabs
floor
fmod
frexp
ldexp
log
log10
modf
pow
printf
sin
sinh
sprintf
sqrt
strtod
tan
tanh
Common Input/Output Functions
Two of the functions that perform stream output are included in both the
integer and floating point libraries. The functionalities of the versions in
the integer library are a subset of the functionalities of their floating
point counterparts. The versions in the integer library cannot print or
manipulate floating point numbers. These functions are: printf, sprintf.
Functions Implemented as Macros
Two of the functions in the C library are actually implemented as “macros”. Unlike other functions, which (if they do not return int) are
declared in header files and defined in a separate object module that is
linked in with your program later, functions implemented as macros are
defined using #define preprocessor directives in the header file that
declares them. Macros can therefore be used independently of any
library by including the header file that defines and declares them with
your program, as explained below. The functions in the C library that
are implemented as macros are: max and min.
© 2007 COSMIC Software
Using The Compiler
77
4
C Library Support
Including Header Files
If your application calls a C library function, you must include the
header file that declares the function at compile time, in order to use the
proper return type and the proper function prototyping, so that all the
expected arguments are properly evaluated. You do this by writing a
preprocessor directive of the form:
#include
in your program, where is the name of the appropriate
header file enclosed in angle brackets. The required header file should
be included before you refer to any function that it declares.
The names of the header files packaged with the C library and the functions declared in each header are listed below.
- Header file for the assertion macro: assert.
- Header file for the character functions: isalnum, isalpha,
iscntrl, isgraph, isprint, ispunct, isspace, isxdigit, isdigit, isupper,
islower, tolower and toupper.
- Header file for limit constants for floating point values.
- Header files for input-output registers. Each register has an
upper-case name which matches the data sheet definition. The compiler
provides a large set of header files for most derivative processors.
- Header file for limit constants of the compiler.
- Header file for mathematical functions: acos, asin, atan,
atan2, ceil, cos, cosh, exp, fabs, floor, fmod, frexp, ldexp, log, log10,
modf, pow, sin, sinh, sqrt, tan and tanh.
- Header file for inline functions: carry, irq, imask.
- Header file for type bool and values true, false.
- Header file for types: size_t, wchar_t and ptrdiff_t.
78
Using The Compiler
© 2007 COSMIC Software
Descriptions of C Library Functions
- Header file for stream input/output: getchar, gets, printf,
putchar, puts and sprintf.
- Header file for general utilities: abs, abort, atof, atoi, atol,
div, exit, labs, ldiv, rand, srand, strtod, strtol and strtoul.
- Header file for string functions: memchr, memcmp, memcpy, memmove, memset, strcat, strchr, strcmp, strcpy, strcspn, strlen,
strncat, strncmp, strncpy, strpbrk, strrchr, strspn and strstr.
Functions returning int - C library functions that return int and can
therefore be called without any header file are: isalnum, isalpha, iscntrl,
isgraph, isprint, ispunct, isspace, isxdigit, isdigit, isupper, islower,
sbreak, tolower and toupper.
Descriptions of C Library Functions
The following pages describe each of the functions in the C library in
quick reference format. The descriptions are in alphabetical order by
function name.
The syntax field describes the function prototype with the return type
and the expected arguments, and if any, the header file name where this
function has been declared.
© 2007 COSMIC Software
Using The Compiler
79
4
C Library - _asm
_asm
Description
Generate inline assembly code
Syntax
_asm(“string constant”, arguments...)
Function
_asm() generates inline assembly code by copying
and quoting it into the output assembly code stream. are
first evaluated following the usual rules for passing arguments. The first
argument is kept in the a register or the x:a register pair whenever possible, and all other arguments are pushed onto the stack. After the
code is output, arguments pushed to the stack are
removed before to continue.
Return Value
Nothing, unless _asm() is used in an expression. In that case, standard
return conventions must be followed. See “Register Usage” in Chapter
3.
Example
The sequence inc x; call _main, may be generated by the following call:
_asm(“inc x\n call _main”);
Note that the string-quoting syntax matches the familiar printf() function.
Notes
_asm() is not packaged in any library. It is recognized by the compiler
itself.
For more information, see “Inserting Inline Assembly Instructions” in
Chapter 3.
80
Using The Compiler
© 2007 COSMIC Software
C Library - abort
abort
Description
Abort program execution
Syntax
#include
void abort(void)
Function
abort stops the program execution by calling the exit function which is
placed by the startup module just after the call to the main function.
Return Value
abort never returns.
Example
To abort in case of error:
if (fatal_error)
abort();
See Also
exit
Notes
abort is a macro equivalent to the function name exit.
© 2007 COSMIC Software
Using The Compiler
81
4
C Library - abs
abs
Description
Find absolute value
Syntax
#include
int abs(int i)
Function
abs obtains the absolute value of i. No check is made to see that the
result can be properly represented.
Return Value
abs returns the absolute value of i, expressed as an int.
Example
To print out a debit or credit balance:
printf(“balance %d%s\n”, abs(bal), (bal < 0)? “CR” : “”);
See Also
labs, fabs
Notes
abs is packaged in the integer library, and may be implemented as a
macro.
82
Using The Compiler
© 2007 COSMIC Software
C Library - acos
acos
Description
Arccosine
Syntax
#include
double acos(double x)
Function
acos computes the angle in radians the cosine of which is x, to full double precision.
Return Value
acos returns the closest internal representation to acos(x), expressed as
a double floating value in the range [0, pi]. If x is outside the range
[-1, 1], acos returns zero.
Example
To find the arccosine of x:
theta = acos(x);
See Also
asin, atan, atan2
Notes
acos is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler
83
4
C Library - asin
asin
Description
Arcsine
Syntax
#include
double asin(double x)
Function
asin computes the angle in radians the sine of which is x, to full double
precision.
Return Value
asin returns the nearest internal representation to asin(x), expressed as a
double floating value in the range [-pi/2, pi/2]. If x is outside the range
[-1, 1], asin returns zero.
Example
To compute the arcsine of y:
theta = asin(y);
See Also
acos, atan, atan2
Notes
asin is packaged in the floating point library.
84
Using The Compiler
© 2007 COSMIC Software
C Library - atan
atan
Description
Arctangent
Syntax
#include
double atan(double x)
Function
atan computes the angle in radians; the tangent of which is x, atan
computes the angle in radians; the tangent of which is x, to full double
precision.
Return Value
atan returns the nearest internal representation to atan(x), expressed as
a double floating value in the range [-pi/2, pi/2].
Example
To find the phase angle of a vector in degrees:
theta = atan(y/x) * 180.0 / pi;
See Also
acos, asin, atan2
Notes
atan is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler
85
4
C Library - atan2
atan2
Description
Arctangent of y/x
Syntax
#include
double atan2(double y, double x)
Function
atan2 computes the angle in radians the tangent of which is y/x to full
double precision. If y is negative, the result is negative. If x is negative,
the magnitude of the result is greater than pi/2.
Return Value
atan2 returns the closest internal representation to atan(y/x), expressed
as a double floating value in the range [-pi, pi]. If both input arguments
are zero, atan2 returns zero.
Example
To find the phase angle of a vector in degrees:
theta = atan2(y/x) * 180.0/pi;
See Also
acos, asin, atan
Notes
atan2 is packaged in the floating point library.
86
Using The Compiler
© 2007 COSMIC Software
C Library - atof
atof
Description
Convert buffer to double
Syntax
#include
double atof(char *nptr)
Function
atof converts the string at nptr into a double. The string is taken as the
text representation of a decimal number, with an optional fraction and
exponent. Leading whitespace is skipped and an optional sign is permitted; conversion stops on the first unrecognizable character. Acceptable
inputs match the pattern:
[+|-]d*[.d*][e[+|-]dd*]
where d is any decimal digit and e is the character ‘e’ or ‘E’. No checks
are made against overflow, underflow, or invalid character strings.
Return Value
atof returns the converted double value. If the string has no recognizable characters, it returns zero.
Example
To read a string from STDIN and convert it to a double at d:
gets(buf);
d = atof(buf);
See Also
atoi, atol, strtol, strtod
Notes
atof is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler
87
4
C Library - atoi
atoi
Description
Convert buffer to integer
Syntax
#include
int atoi(char *nptr)
Function
atoi converts the string at nptr into an integer. The string is taken as the
text representation of a decimal number. Leading whitespace is skipped
and an optional sign is permitted; conversion stops on the first unrecognizable character. Acceptable characters are the decimal digits. If the
stop character is l or L, it is skipped over.
No checks are made against overflow or invalid character strings.
Return Value
atoi returns the converted integer value. If the string has no recognizable characters, zero is returned.
Example
To read a string from STDIN and convert it to an int at i:
gets(buf);
i = atoi(buf);
See Also
atof, atol, strtol, strtod
Notes
atoi is packaged in the integer library.
88
Using The Compiler
© 2007 COSMIC Software
C Library - atol
atol
Description
Convert buffer to long
Syntax
#include
long atol(char *nptr)
Function
atol converts the string at nptr into a long integer. The string is taken as
the text representation of a decimal number. Leading whitespace is
skipped and an optional sign is permitted; conversion stops on the first
unrecognizable character. Acceptable characters are the decimal digits.
If the stop character is l or L it is skipped over.
No checks are made against overflow or invalid character strings.
Return Value
atol returns the converted long integer. If the string has no recognizable
characters, zero is returned.
Example
To read a string from STDIN and convert it to a long l:
gets(buf);
l = atol(buf);
See Also
atof, atoi, strtol, strtod
Notes
atol is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler
89
4
C Library - carry
carry
Description
Test or get the carry bit
Syntax
#include
@inline char carry(void)
Function
carry is an inline function allowing to test or get the value of the carry
bit. When used in an if construct, this function expands directly to a bcc
or bcs instruction. When used in an expression, it expands in order to
build in the a register the value 0 or 1 depending on the carry bit value.
Return Value
carry returns 0 or 1 in the a register if such a value is needed.
Example
low <<= 1;
if (carry())
++high;
produces
sll
_low
jruge L1
inc
_high
L1:
low <<= 1;
high = carry()
produces
sll
clr
rlc
ld
_low
a
a
_high,a
Notes
carry is an inline function and then is not defined in any library. It is
therefore not possible to take its address. For more information, see
“Inline Function” in Chapter 3.
90
Using The Compiler
© 2007 COSMIC Software
C Library - ceil
ceil
Description
Round to next higher integer
Syntax
#include
double ceil(double x)
Function
ceil computes the smallest integer greater than or equal to x.
Return Value
ceil returns the smallest integer greater than or equal to x, expressed as
a double floating value.
Example
x
5.1
5.0
0.0
-5.0
-5.1
ceil(x)
6.0
5.0
0.0
-5.0
-5.0
See Also
floor
Notes
ceil is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler
91
4
C Library - _checksum
_checksum
Description
Verify the recorded checksum
Syntax
int _checksum()
Function
_checksum scans the descriptor built by the linker and controls that the
computed checksum is equal to the one expected. For more infomation,
see “Checksum Computation” in Chapter 6.
Return Value
_checksum returns 0 if the checksum is correct, or a value different of 0
otherwise.
Example
if (_checksum())
abort();
Notes
The descriptor is built by the linker only if the _checksum function is
called by the application, even if there are segments marked with the
-ck option.
_checksum is packaged in the integer library.
See Also
_checksumx, _checksum16, _checksum16x
92
Using The Compiler
© 2007 COSMIC Software
C Library - _checksumx
_checksumx
Description
Verify the recorded checksum
Syntax
int _checksumx()
Function
_checksumx scans the descriptor built by the linker and controls at the
end that the computed 8 bit checksum is equal to the one expected. For
more infomation, see “Checksum Computation” in Chapter 6.
Return Value
_checksumx returns 0 if the checksum is correct, or a value different of
0 otherwise.
Example
if (_checksumx())
abort();
Notes
The descriptor is built by the linker only if the _checksumx function is
called by the application, even if there are segments marked with the
-ck option.
_checksumx is packaged in the integer library.
See Also
_checksum, _checksum16, _checksum16x
© 2007 COSMIC Software
Using The Compiler
93
4
C Library - _checksum16
_checksum16
Description
Verify the recorded checksum
Syntax
int _checksum16()
Function
_checksum16 scans the descriptor built by the linker and controls at the
end that the computed 16 bit checksum is equal to the one expected. For
more infomation, see “Checksum Computation” in Chapter 6.
Return Value
_checksum16 returns 0 if the checksum is correct, or a value different of
0 otherwise.
Example
if (_checksum16())
abort();
Notes
The descriptor is built by the linker only if the _checksum16 function is
called by the application, even if there are segments marked with the
-ck option.
_checksum16 is packaged in the integer library.
See Also
_checksum, _checksumx, _checksum16x
94
Using The Compiler
© 2007 COSMIC Software
C Library - _checksum16x
_checksum16x
Description
Verify the recorded checksum
Syntax
int _checksum16x()
Function
_checksum16x scans the descriptor built by the linker and controls at
the end that the computed 16 bit checksum is equal to the one expected.
For more infomation, see “Checksum Computation” in Chapter 6.
Return Value
_checksum16x returns 0 if the checksum is correct, or a value different
of 0 otherwise.
Example
if (_checksum16x())
abort();
Notes
The descriptor is built by the linker only if the _checksum16x function
is called by the application, even if there are segments marked with the
-ck option.
_checksum16x is packaged in the integer library.
See Also
_checksum, _checksumx, _checksum16
© 2007 COSMIC Software
Using The Compiler
95
4
C Library - cos
cos
Description
Cosine
Syntax
#include
double cos(double x)
Function
cos computes the cosine of x, expressed in radians, to full double precision. If the magnitude of x is too large to contain a fractional quadrant
part, the value of cos is 1.
Return Value
cos returns the nearest internal representation to cos(x) in the range [0,
pi], expressed as a double floating value. A large argument may return a
meaningless value.
Example
To rotate a vector through the angle theta:
xnew = xold * cos(theta) - yold * sin(theta);
ynew = xold * sin(theta) + yold * cos(theta);
See Also
sin, tan
Notes
cos is packaged in the floating point library.
96
Using The Compiler
© 2007 COSMIC Software
C Library - cosh
cosh
Description
Hyperbolic cosine
Syntax
#include
double cosh(double x)
Function
cosh computes the hyperbolic cosine of x to full double precision.
Return Value
cosh returns the nearest internal representation to cosh(x) expressed as a
double floating value. If the result is too large to be properly represented, cosh returns zero.
Example
To use the Moivre's theorem to compute (cosh x + sinh x) to the nth
power:
demoivre = cosh(n * x) + sinh(n * x);
See Also
exp, sinh, tanh
Notes
cosh is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler
97
4
C Library - div
div
Description
Divide with quotient and remainder
Syntax
#include
div_t div(int numer, int denom)
Function
div divides the integer numer by the integer denom and returns the quotient and the remainder in a structure of type div_t. The field quot contains the quotient and the field rem contains the remainder.
Return Value
div returns a structure of type div_t containing both quotient and
remainder.
Example
To get minutes and seconds from a delay in seconds:
div_t result;
result = div(time, 60);
min = result.quo;
sec = result.rem;
See Also
ldiv
Notes
div is packaged in the integer library.
98
Using The Compiler
© 2007 COSMIC Software
C Library - eepera
eepera
Description
Erase the full eeprom space
Syntax
void eepera(void)
Function
eepera erases the full eeprom space with the global erase sequence. It
does not erase the config register.
Return Value
Nothing.
Example
To erase the full eeprom space:
eepera();
See Also
Notes
eepera is packaged in the machine library.
© 2007 COSMIC Software
Using The Compiler
99
4
C Library - exit
exit
Description
Exit program execution
Syntax
#include
void exit(int status)
Function
exit stops the execution of a program by switching to the startup module just after the call to the main function. The status argument is not
used by the current implementation.
Return Value
exit never returns.
Example
To exit in case of error:
if (fatal_error)
exit();
See Also
abort
Notes
exit is in the startup module.
100 Using The Compiler
© 2007 COSMIC Software
C Library - exp
exp
Description
Exponential
Syntax
#include
double exp(double x)
Function
exp computes the exponential of x to full double precision.
Return Value
exp returns the nearest internal representation to exp x, expressed as a
double floating value. If the result is too large to be properly represented, exp returns zero.
Example
To compute the hyperbolic sine of x:
sinh = (exp(x) - exp(-x)) / 2.0;
See Also
log
Notes
exp is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 101
4
C Library - fabs
fabs
Description
Find double absolute value
Syntax
#include
double fabs(double x)
Function
fabs obtains the absolute value of x.
Return Value
fabs returns the absolute value of x, expressed as a double floating
value.
Example
x
fabs(x)
5.0
0.0
-3.7
5.0
0.0
3.7
See Also
abs, labs
Notes
fabs is packaged in the floating point library.
102 Using The Compiler
© 2007 COSMIC Software
C Library - _fctcpy
_fctcpy
Description
Copy a moveable code segment in RAM
Syntax
int _fctcpy(char name);
Function
_fctcpy copies a moveable code segment in RAM from its storage location in ROM. _fctcpy scans the descriptor built by the linker and looks
for a moveable segment whose flag byte matches the given argument. If
such a segment is found, it is entirely copied in RAM. Any function
defined in that segment may then be called directly. For more information, see “Moveable Code” in Chapter 6.
Return Value
_fctcpy returns a non zero value if a segment has been found and copied. It returns 0 otherwise.
Example
if (_fctcpy(‘b’))
flash();
Notes
_fctcpy is packaged in the machine library.
© 2007 COSMIC Software
Using The Compiler 103
4
C Library - floor
floor
Description
Round to next lower integer
Syntax
#include
double floor(double x)
Function
floor computes the largest integer less than or equal to x.
Return Value
floor returns the largest integer less than or equal to x, expressed as a
double floating value.
Example
x
5.1
5.0
0.0
-5.0
-5.1
floor(x)
5.0
5.0
0.0
-5.0
-6.0
See Also
ceil
Notes
floor is packaged in the floating point library.
104 Using The Compiler
© 2007 COSMIC Software
C Library - fmod
fmod
Description
Find double modulus
Syntax
#include
double fmod(double x, double y)
Function
fmod computes the floating point remainder of x / y, to full double precision. The return value of f is determined using the formula:
f=x-i*y
where i is some integer, f is the same sign as x, and the absolute value of
f is less than the absolute value of y.
Return Value
fmod returns the value of f expressed as a double floating value. If y is
zero, fmod returns zero.
Example
x
5.5
5.0
0.0
-5.5
y
5.0
5.0
0.0
5.0
fmod(x, y)
0.5
0.0
0.0
-0.5
Notes
fmod is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 105
4
C Library - frexp
frexp
Description
Extract fraction from exponent part
Syntax
#include
double frexp(double val, int *exp)
Function
frexp partitions the double at val, which should be non-zero, into a fraction in the interval [1/2, 1) times two raised to an integer power. It then
delivers the integer power to *exp, and returns the fractional portion as
the value of the function. The exponent is generally meaningless if val
is zero.
Return Value
frexp returns the power of two fraction of the double at val as the return
value of the function, and writes the exponent at *exp.
Example
To implement the sqrt(x) function:
double sqrt(double x)
{
extern double newton(double);
int n;
x = frexp(x, &n);
x = newton(x);
if (n & 1)
x *= SQRT2;
return (ldexp(x, n / 2));
}
See Also
ldexp
Notes
frexp is packaged in the floating point library.
106 Using The Compiler
© 2007 COSMIC Software
C Library - getchar
getchar
Description
Get character from input stream
Syntax
#include
int getchar(void)
Function
getchar obtains the next input character, if any, from the user supplied
input stream. This user must rewrite this function in C or in assembly
language to provide an interface to the input mechanism of the C
library.
Return Value
getchar returns the next character from the input stream. If end of file
(break) is encountered, or a read error occurs, getchar returns EOF.
Example
To copy characters from the input stream to the output stream:
while ((c = getchar()) != EOF)
putchar(c);
See Also
putchar
Notes
getchar is packaged in the integer library, and is by default using the
first serial port SCI 1.
© 2007 COSMIC Software
Using The Compiler 107
4
C Library - gets
gets
Description
Get a text line from input stream
Syntax
#include
char *gets(char *s)
Function
gets copies characters from the input stream to the buffer starting at s.
Characters are copied until a newline is reached or end of file is
reached. If a newline is reached, it is discarded and a NUL is written
immediately following the last character read into s.
gets uses getchar to read each character.
Return Value
gets returns s if successful. If end of file is reached, gets returns NULL.
If a read error occurs, the array contents are indeterminate and gets
returns NULL.
Example
To copy input to output, line by line:
while (puts(gets(buf)))
;
See Also
puts
Notes
There is no assured limit on the size of the line read by gets.
gets is packaged in the integer library.
108 Using The Compiler
© 2007 COSMIC Software
C Library - imask
imask
Description
Test the interrupt mask bit
Syntax
#include
@inline char imask(void)
Function
imask is an inline function allowing to test the interrupt mask bit. The
imask function can only be used in an if construct. This function
expands directly to a bms or bmc instruction.
Return Value
None.
Example
if (imask())
++high;
produces
jrnm
inc
L3
_high
bms
inc
L1
_high
L3:
if (!imask())
++high
produces
L1:
Notes
imask is an inline function and then is not defined in any library. It is
therefore not possible to take its address. For more information, see
“Inline Function” in Chapter 3.
© 2007 COSMIC Software
Using The Compiler 109
4
C Library - irq
irq
Description
Test the interrupt line level
Syntax
#include
@inline char irq(void)
Function
irq is an inline function allowing to test the interrupt line level. The irq
function can only be used in an if construct. This function expands
directly to a bih or bil instruction.
Return Value
None.
Example
if (irq())
++high;
produces
jril
inc
L3
_high
bih
inc
L1
_high
L3:
if (!irq())
++high
produces
L1:
Notes
irq is an inline function and then is not defined in any library. It is therefore not possible to take its address. For more information, see “Inline
Function” in Chapter 3.
110 Using The Compiler
© 2007 COSMIC Software
C Library - isalnum
isalnum
Description
Test for alphabetic or numeric character
Syntax
#include
int isalnum(char c)
Function
isalnum tests whether c is an alphabetic character (either upper or
lower case), or a decimal digit.
Return Value
isalnum returns nonzero if the argument is an alphabetic or numeric
character; otherwise the value returned is zero.
Example
To test for a valid C identifier:
if (isalpha(*s) || *s == '_')
for (++s; isalnum(*s) || *s == '_'; ++s)
;
See Also
isalpha, isdigit, islower, isupper, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isalnum is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 111
4
C Library - isalpha
isalpha
Description
Test for alphabetic character
Syntax
#include
int isalpha(char c)
Function
isalpha tests whether c is an alphabetic character, either upper or lower
case.
Return Value
isalpha returns nonzero if the argument is an alphabetic character. Otherwise the value returned is zero.
Example
To find the end points of an alphabetic string:
while (*first && !isalpha(*first))
++first;
for (last = first; isalpha(*last); ++last)
;
See Also
isalnum, isdigit, islower, isupper, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isalpha is packaged in the integer library.
112 Using The Compiler
© 2007 COSMIC Software
C Library - iscntrl
iscntrl
Description
Test for control character
Syntax
#include
int iscntrl(char c)
Function
iscntrl tests whether c is a delete character (0177 in ASCII), or an ordinary control character (less than 040 in ASCII).
Return Value
iscntrl returns nonzero if c is a control character; otherwise the value is
zero.
Example
To map control characters to percent signs:
for (; *s; ++s)
if (iscntrl(*s))
*s = '%';
See Also
isgraph, isprint, ispunct, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
iscntrl is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 113
4
C Library - isdigit
isdigit
Description
Test for digit
Syntax
#include
int isdigit(char c)
Function
isdigit tests whether c is a decimal digit.
Return Value
isdigit returns nonzero if c is a decimal digit; otherwise the value
returned is zero.
Example
To convert a decimal digit string to a number:
for (sum = 0; isdigit(*s); ++s)
sum = sum * 10 + *s - '0';
See Also
isalnum, isalpha, islower, isupper, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isdigit is packaged in the integer library.
114 Using The Compiler
© 2007 COSMIC Software
C Library - isgraph
isgraph
Description
Test for graphic character
Syntax
#include
int isgraph(char c)
Function
isgraph tests whether c is a graphic character; i.e. any printing character except a space (040 in ASCII).
Return Value
isgraph returns nonzero if c is a graphic character. Otherwise the value
returned is zero.
Example
To output only graphic characters:
for (; *s; ++s)
if (isgraph(*s))
putchar(*s);
See Also
iscntrl, isprint, ispunct, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isgraph is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 115
4
C Library - islower
islower
Description
Test for lowercase character
Syntax
#include
int islower(char c)
Function
islower tests whether c is a lowercase alphabetic character.
Return Value
islower returns nonzero if c is a lowercase character; otherwise the
value returned is zero.
Example
To convert to uppercase:
if (islower(c))
c += 'A' - 'a';
/* also see toupper() */
See Also
isalnum, isalpha, isdigit, isupper, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
islower is packaged in the integer library.
116 Using The Compiler
© 2007 COSMIC Software
C Library - isprint
isprint
Description
Test for printing character
Syntax
#include
int isprint(char c)
Function
isprint tests whether c is any printing character. Printing characters are
all characters between a space (040 in ASCII) and a tilde ‘~’ character
(0176 in ASCII).
Return Value
isprint returns nonzero if c is a printing character; otherwise the value
returned is zero.
Example
To output only printable characters:
for (; *s; ++s)
if (isprint(*s))
putchar(*s);
See Also
iscntrl, isgraph, ispunct, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isprint is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 117
4
C Library - ispunct
ispunct
Description
Test for punctuation character
Syntax
#include
int ispunct(char c)
Function
ispunct tests whether c is a punctuation character. Punctuation characters include any printing character except space, a digit, or a letter.
Return Value
ispunct returns nonzero if c is a punctuation character; otherwise the
value returned is zero.
Example
To collect all punctuation characters in a string into a buffer:
for (i = 0; *s; ++s)
if (ispunct(*s))
buf[i++] = *s;
See Also
iscntrl, isgraph, isprint, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
ispunct is packaged in the integer library.
118 Using The Compiler
© 2007 COSMIC Software
C Library - isspace
isspace
Description
Test for whitespace character
Syntax
#include
int isspace(char c)
Function
isspace tests whether c is a whitespace character. Whitespace characters
are horizontal tab (‘\t’), newline (‘\n’), vertical tab (‘\v’), form feed
(‘\f’), carriage return (‘\r’), and space (‘ ’).
Return Value
isspace returns nonzero if c is a whitespace character; otherwise the
value returned is zero.
Example
To skip leading whitespace:
while (isspace(*s))
++s;
See Also
iscntrl, isgraph, isprint, ispunct
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isspace is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 119
4
C Library - isupper
isupper
Description
Test for uppercase character
Syntax
int isupper(char c)
Function
isupper tests whether c is an uppercase alphabetic character.
Return Value
isupper returns nonzero if c is an uppercase character; otherwise the
value returned is zero.
Example
To convert to lowercase:
if (isupper(c))
c += 'a' - 'A'; /* also see tolower() */
See Also
isalnum, isalpha, isdigit, islower, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isupper is packaged in the integer library.
120 Using The Compiler
© 2007 COSMIC Software
C Library - isxdigit
isxdigit
Description
Test for hexadecimal digit
Syntax
#include
int isxdigit(char c)
Function
isxdigit tests whether c is a hexadecimal digit, i.e. in the set
[0123456789abcdefABCDEF].
Return Value
isxdigit returns nonzero if c is a hexadecimal digit; otherwise the value
returned is zero.
Example
To accumulate a hexadecimal digit:
for (sum = 0; isxdigit(*s); ++s)
if (isdigit(*s)
sum = sum * 10 + *s - '0';
else
sum = sum * 10 + tolower(*s) + (10 - 'a');
See Also
isalnum, isalpha, isdigit, islower, isupper, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isxdigit is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 121
4
C Library - labs
labs
Description
Find long absolute value
Syntax
#include
long labs(long l)
Function
labs obtains the absolute value of l. No check is made to see that the
result can be properly represented.
Return Value
labs returns the absolute value of l, expressed as an long int.
Example
To print out a debit or credit balance:
printf(“balance %ld%s\n”,labs(bal),(bal < 0) ? “CR” : “”);
See Also
abs, fabs
Notes
labs is packaged in the integer library.
122 Using The Compiler
© 2007 COSMIC Software
C Library - ldexp
ldexp
Description
Scale double exponent
Syntax
#include
double ldexp(double x, int exp)
Function
ldexp multiplies the double x by two raised to the integer power exp.
Return Value
ldexp returns the double result x * (1 << exp) expressed as a double
floating value. If a range error occurs, ldexp returns HUGE_VAL.
Example
x
1.0
1.0
1.0
0.0
exp
1
0
-1
0
ldexp(x, exp)
2.0
1.0
0.5
0.0
See Also
frexp, modf
Notes
ldexp is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 123
4
C Library - ldiv
ldiv
Description
Long divide with quotient and remainder
Syntax
#include
ldiv_t ldiv(long numer, long denom)
Function
ldiv divides the long integer numer by the long integer denom and
returns the quotient and the remainder in a structure of type ldiv_t. The
field quot contains the quotient and the field rem contains the remainder.
Return Value
ldiv returns a structure of type ldiv_t containing both quotient and
remainder.
Example
To get minutes and seconds from a delay in seconds:
ldiv_t result;
result = ldiv(time, 60L);
min = result.quo;
sec = result.rem;
See Also
div
Notes
ldiv is packaged in the integer library.
124 Using The Compiler
© 2007 COSMIC Software
C Library - log
log
Description
Natural logarithm
Syntax
#include
double log(double x)
Function
log computes the natural logarithm of x to full double precision.
Return Value
log returns the closest internal representation to log(x), expressed as a
double floating value. If the input argument is less than zero, or is too
large to be represented, log returns zero.
Example
To compute the hyperbolic arccosine of x:
arccosh = log(x + sqrt(x * x - 1));
See Also
exp
Notes
log is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 125
4
C Library - log10
log10
Description
Common logarithm
Syntax
#include
double log10(double x)
Function
log10 computes the common log of x to full double precision by computing the natural log of x divided by the natural log of 10. If the input
argument is less than zero, a domain error will occur. If the input argument is zero, a range error will occur.
Return Value
log10 returns the nearest internal representation to log10 x, expressed
as a double floating value. If the input argument is less than or equal to
zero, log10 returns zero.
Example
To determine the number of digits in x, where x is a positive integer
expressed as a double:
ndig = log10(x) + 1;
See Also
log
Notes
log10 is packaged in the floating point library.
126 Using The Compiler
© 2007 COSMIC Software
C Library - max
max
Description
Test for maximum
Syntax
#include
max(a,b)
Function
max obtains the maximum of its two arguments, a and b. Since max is
implemented as a C preprocessor macro, its arguments can be any
numerical type, and type coercion occurs automatically.
Return Value
max is a numerical rvalue of the form ((a < b) ? b : a), suitably parenthesized.
Example
To set a new maximum level:
hiwater = max(hiwater, level);
See Also
min
Notes
max is an extension to the proposed ANSI C standard.
max is a macro declared in the header file. You can use it by
including with your program. Because it is a macro, max
cannot be called from non-C programs, nor can its address be taken.
Arguments with side effects may be evaluated other than once.
© 2007 COSMIC Software
Using The Compiler 127
4
C Library - memchr
memchr
Description
Scan buffer for character
Syntax
#include
void *memchr(void *s, char c, unsigned char n)
Function
memchr looks for the first occurrence of a specific character c in an n
character buffer starting at s.
Return Value
memchr returns a pointer to the first character that matches c, or NULL
if no character matches.
Example
To map keybuf[] characters into subst[] characters:
if ((t = memchr(keybuf, *s, KEYSIZ)) != NULL)
*s = subst[t - keybuf];
See Also
strchr, strcspn, strpbrk, strrchr, strspn
Notes
memchr is packaged in the integer library.
128 Using The Compiler
© 2007 COSMIC Software
C Library - memcmp
memcmp
Description
Compare two buffers for lexical order
Syntax
#include
int memcmp(void *s1, void *s2, unsigned char n)
Function
memcmp compares two text buffers, character by character, for lexical
order in the character collating sequence. The first buffer starts at s1,
the second at s2; both buffers are n characters long.
Return Value
memcmp returns a short integer greater than, equal to, or less than zero,
according to whether s1 is lexicographically greater than, equal to, or
less than s2.
Example
To look for the string “include” in name:
if (memcmp(name, “include”, 7) == 0)
doinclude();
See Also
strcmp, strncmp
Notes
memcmp is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 129
4
C Library - memcpy
memcpy
Description
Copy one buffer to another
Syntax
#include
void *memcpy(void *s1, void *s2, unsigned char n)
Function
memcpy copies the first n characters starting at location s2 into the
buffer beginning at s1.
Return Value
memcpy returns s1.
Example
To place “first string, second string” in buf[]:
memcpy(buf, “first string”, 12);
memcpy(buf + 13, “, second string”, 15);
See Also
strcpy, strncpy
Notes
memcpy is packaged in the integer library and may be implemented as
an inline function.
130 Using The Compiler
© 2007 COSMIC Software
C Library - memmove
memmove
Description
Copy one buffer to another
Syntax
#include
void *memmove(void *s1, void *s2, unsigned char n)
Function
memmove copies the first n characters starting at location s2 into the
buffer beginning at s1. If the two buffers overlap, the function performs
the copy in the appropriate sequence, so the copy is not corrupted.
Return Value
memmove returns s1.
Example
To shift an array of characters:
memmove(buf, &buf[5], 10);
See Also
memcpy
Notes
memmove is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 131
4
C Library - memset
memset
Description
Propagate fill character throughout buffer
Syntax
#include
void *memset(void *s, char c, unsigned char n)
Function
memset floods the n character buffer starting at s with fill character c.
Return Value
memset returns s.
Example
To flood a 512-byte buffer with NULs:
memset(buf,'\0', BUFSIZ);
Notes
memset is packaged in the integer library and may be implemented as
an inline function.
132 Using The Compiler
© 2007 COSMIC Software
C Library - min
min
Description
Test for minimum
Syntax
#include
min(a, b)
Function
min obtains the minimum of its two arguments, a and b. Since min is
implemented as a C preprocessor macro, its arguments can be any
numerical type, and type coercion occurs automatically.
Return Value
min is a numerical rvalue of the form ((a < b) ? a : b), suitably parenthesized.
Example
To set a new minimum level:
nmove = min(space, size);
See Also
max
Notes
min is an extension to the ANSI C standard.
min is a macro declared in the header file. You can use it by
including with your program. Because it is a macro, min
cannot be called from non-C programs, nor can its address be taken.
Arguments with side effects may be evaluated more than once.
© 2007 COSMIC Software
Using The Compiler 133
4
C Library - modf
modf
Description
Extract fraction and integer from double
Syntax
#include
double modf(double val, double *pd)
Function
modf partitions the double val into an integer portion, which is delivered to *pd, and a fractional portion, which is returned as the value of
the function. If the integer portion cannot be represented properly in an
int, the result is truncated on the left without complaint.
Return Value
modf returns the signed fractional portion of val as a double floating
value, and writes the integer portion at *pd.
Example
val
5.1
5.0
4.9
0.0
-1.4
*pd
5
5
4
0
-1
modf(val, *pd)
0.1
0.0
0.9
0.0
-0.4
See Also
frexp, ldexp
Notes
modf is packaged in the floating point library.
134 Using The Compiler
© 2007 COSMIC Software
C Library - pow
pow
Description
Raise x to the y power
Syntax
#include
double pow(double x, double y)
Function
pow computes the value of x raised to the power of y.
Return Value
pow returns the value of x raised to the power of y, expressed as a double floating value. If x is zero and y is less than or equal to zero, or if x
is negative and y is not an integer, pow returns zero.
Example
x
2.0
2.0
2.0
1.0
0.0
-1.0
-1.0
y
2.0
1.0
0.0
any
-2.0
2.0
2.1
pow(x, y)
4.0
2.0
1.0
1.0
0
1.0
0
See Also
exp
Notes
pow is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 135
4
C Library - printf
printf
Description
Output formatted arguments to stdout
Syntax
#include
int printf(@near char *fmt, ...)
Function
printf writes formatted output to the output stream using the format
string at fmt and the arguments specified by ..., as described below.
printf uses putchar to output each character.
Format Specifiers
The format string at fmt consists of literal text to be output, interspersed
with conversion specifications that determine how the arguments are to
be interpreted and how they are to be converted for output. If there are
insufficient arguments for the format, the results are undefined. If the
format is exhausted while arguments remain, the excess arguments are
evaluated but otherwise ignored. printf returns when the end of the format string is encountered.
Each is started by the character ‘%’. After
the ‘%’, the following appear in sequence:
- zero or more which modify the meaning of the conversion
specification.
- a decimal number which optionally specifies a minimum field width. If the converted value has fewer characters than the
field width, it is padded on the left (or right, if the left adjustment flag
has been given) to the field width. The padding is with spaces unless the
field width digit string starts with zero, in which case the padding is
with zeros.
136 Using The Compiler
© 2007 COSMIC Software
C Library - printf
- a decimal number which specifies the minimum
number of digits to appear for d, i, o, u, x, and X conversions, the
number of digits to appear after the decimal point for e, E, and f conversions, the maximum number of significant digits for the g and G conversions, or the maximum number of characters to be printed from a
string in an s conversion. The precision takes the form of a period followed by a decimal digit string. A null digit string is treated as zero.
h - optionally specifies that the following d, i, o, u, x, or X conversion
character applies to a short int or unsigned short int argument (the argument will have been widened according to the integral widening conversions, and its value must be cast to short or unsigned short before
printing). It specifies a short pointer argument if associated with the p
conversion character. If an h appears with any other conversion character, it is ignored.
l - optionally specifies that the d, i, o, u, x, and X conversion character
applies to a long int or unsigned long int argument. It specifies a long or
far pointer argument if used with the p conversion character. If the l
appears with any other conversion character, it is ignored.
L - optionally specifies that the following e, E, f, g, and G conversion
character applies to a long double argument. If the L appears with any
other conversion character, it is ignored.
- character that indicates the type of conversion to be applied.
A field width or precision, or both, may be indicated by an asterisk '*'
instead of a digit string. In this case, an int argument supplies the field
width or precision. The arguments supplying field width must appear
before the optional argument to be converted. A negative field width
argument is taken as a - flag followed by a positive field width. A negative precision argument is taken as if it were missing.
The field is zero or more of the following:
space - a space will be prepended if the first character of a signed conversion is not a sign. This flag will be ignored if space and + flags are
both specified.
© 2007 COSMIC Software
Using The Compiler 137
4
C Library - printf
# - result is to be converted to an “alternate form”. For c, d, i, s, and u
conversions, the flag has no effect. For o conversion, it increases the
precision to force the first digit of the result to be zero. For p, x and X
conversion, a non-zero result will have Ox or OX prepended to it. For
e, E, f, g, and G conversions, the result will contain a decimal point,
even if no digits follow the point. For g and G conversions, trailing
zeros will not be removed from the result, as they normally are. For p
conversion, it designates hexadecimal output.
+ - result of signed conversion will begin with a plus or minus sign.
- - result of conversion will be left justified within the field.
The is one of the following:
% - a ‘%’ is printed. No argument is converted.
c - the char argument is converted to a character and printed.
d, i, o, u, x, X - the int argument is converted to signed decimal (d or
i), unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal
notation (x or X); the letters abcdef are used for x conversion and the
letters ABCDEF are used for X conversion. The precision specifies the
minimum number of digits to appear; if the value being converted can
be represented in fewer digits, it will be expanded with leading zeros.
The default precision is 1. The result of converting a zero value with
precision of zero is no characters.
e, E - the double argument is converted in the style [-]d.ddde+dd,
where there is one digit before the decimal point and the number of digits after it is equal to the precision. If the precision is missing, six digits
are produced; if the precision is zero, no decimal point appears. The E
format code will produce a number with E instead of e introducing the
exponent. The exponent always contains at least two digits. However, if
the magnitude to be printed is greater than or equal to 1E+100, additional exponent digits will be printed as necessary.
f - the double argument is converted to decimal notation in the style
[-]ddd.ddd, where the number of digits following the decimal point is
equal to the precision specification. If the precision is missing, it is
138 Using The Compiler
© 2007 COSMIC Software
C Library - printf
taken as 6. If the precision is explicitly zero, no decimal point appears.
If a decimal point appears, at least one digit appears before it.
g, G - the double argument is printed in style f or e (or in style E in the
case of a G format code), with the precision specifying the number of
significant digits. The style used depends on the value converted; style
e will be used only if the exponent resulting from the conversion is less
than -4 or greater than the precision. Trailing zeros are removed from
the result; a decimal point appears only if it is followed by a digit.
n - the argument is taken to be an int * pointer to an integer into which
is written the number of characters written to the output stream so far by
this call to printf. No argument is converted.
p - the argument is taken to be a void * pointer to an object. The value
of the pointer is converted to a sequence of printable characters, and
printed as a hexadecimal number with the number of digits printed
being determined by the field width.
s, S - the argument is taken to be a char * pointer to a string. When the
Compact model is used, the s format will use a @tiny pointer and the S
format will use a @near pointer. Characters from the string are written
up to, but not including, the terminating NUL, or until the number of
characters indicated by the precision are written. If the precision is
missing, it is taken to be arbitrarily large, so all characters before the
first NUL are printed.
If the character after '%' is not a valid conversion character, the behavior is undefined.
If any argument is or points to an aggregate (except for an array of characters using %s conversion or any pointer using %p conversion),
unpredictable results will occur.
A nonexistent or small field width does not cause truncation of a field;
if the result is wider than the field width, the field is expanded to contain the conversion result.
Return Value
printf returns the number of characters transmitted, or a negative
number if a write error occurs.
© 2007 COSMIC Software
Using The Compiler 139
4
C Library - printf
Notes
A call with more conversion specifiers than argument variables will
cause unpredictable results.
Example
To print arg, which is a double with the value 5100.53:
printf(“%8.2f\n”, arg);
printf(“%*.*f\n”, 8, 2, arg);
both forms will output: 05100.53
See Also
sprintf
Notes
printf is packaged in both the integer library and the floating point
library. The functionality of the integer only version of printf is a subset
of the functionality of the floating point version. The integer only version cannot print or manipulate floating point numbers. If your programs call the integer only version of printf, the following conversion
specifiers are invalid: e, E, f, g and G. The L modifier is also invalid.
If printf encounters an invalid conversion specifier, the invalid specifier
is ignored and no special message is generated.
140 Using The Compiler
© 2007 COSMIC Software
C Library - putchar
putchar
Description
Put a character to output stream
Syntax
#include
int putchar(char c)
Function
putchar copies c to the user specified output stream.
You must rewrite putchar in either C or assembly language to provide
an interface to the output mechanism to the C library.
Return Value
putchar returns c. If a write error occurs, putchar returns EOF.
Example
To copy input to output:
while ((c = getchar()) != EOF)
putchar(c);
See Also
getchar
Notes
putchar is packaged in the integer library, and is by default using the
first serial port SCI 1.
© 2007 COSMIC Software
Using The Compiler 141
4
C Library - puts
puts
Description
Put a text line to output stream
Syntax
#include
int puts(char *s)
Function
puts copies characters from the buffer starting at s to the output stream
and appends a newline character to the output stream.
puts uses putchar to output each character. The terminating NUL is not
copied.
Return Value
puts returns zero if successful, or else nonzero if a write error occurs.
Example
To copy input to output, line by line:
while (puts(gets(buf)))
;
See Also
gets
Notes
puts is packaged in the integer library.
142 Using The Compiler
© 2007 COSMIC Software
C Library - rand
rand
Description
Generate pseudo-random number
Syntax
#include
int rand(void)
Function
rand computes successive pseudo-random integers in the range
[0, 32767], using a linear multiplicative algorithm which has a period of
2 raised to the power of 32.
Example
int dice()
{
return (rand() % 6 + 1);
}
Return Value
rand returns a pseudo-random integer.
See Also
srand
Notes
rand is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 143
4
C Library - sin
sin
Description
Sin
Syntax
#include
double sin(double x)
Function
sin computes the sine of x, expressed in radians, to full double precision. If the magnitude of x is too large to contain a fractional quadrant
part, the value of sin is 0.
Return Value
sin returns the closest internal representation to sin(x) in the range
[-pi/2, pi/2], expressed as a double floating value. A large argument
may return a meaningless result.
Example
To rotate a vector through the angle theta:
xnew = xold * cos(theta) - yold * sin(theta);
ynew = xold * sin(theta) + yold * cos(theta);
See Also
cos, tan
Notes
sin is packaged in the floating point library.
144 Using The Compiler
© 2007 COSMIC Software
C Library - sinh
sinh
Description
Hyperbolic sine
Syntax
#include
double sinh(double x)
Function
sinh computes the hyperbolic sine of x to full double precision.
Return Value
sinh returns the closest internal representation to sinh(x), expressed as a
double floating value. If the result is too large to be properly represented, sinh returns zero.
Example
To obtain the hyperbolic sine of complex z:
typedef struct
{
double x, iy;
}complex;
complex z;
z.x = sinh(z.x) * cos(z.iy);
z.iy = cosh(z.x) * sin(z.iy);
See Also
cosh, exp, tanh
Notes
sinh is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 145
4
C Library - sprintf
sprintf
Description
Output arguments formatted to buffer
Syntax
#include
int sprintf(char *s, @near char fmt, ...)
Function
sprintf writes formatted to the buffer pointed at by s using the format
string at fmt and the arguments specified by ..., in exactly the same way
as printf. See the description of the printf function for information on
the format conversion specifiers. A NUL character is written after the
last character in the buffer.
Return Value
sprintf returns the numbers of characters written, not including the terminating NUL character.
Example
To format a double at d into buf:
sprintf(buf, “%10f\n”, d);
See Also
printf
Notes
sprintf is packaged in both the integer library and the floating point
library. The functionality of the integer only version of sprintf is a subset of the functionality of the floating point version. The integer only
version cannot print or manipulate floating point numbers. If your programs call the integer only version of sprintf, the following conversion
specifiers are invalid: e, E, f, g and G. The L flag is also invalid.
146 Using The Compiler
© 2007 COSMIC Software
C Library - sqrt
sqrt
Description
Real square root
Syntax
#include
double sqrt(double x)
Function
sqrt computes the square root of x to full double precision.
Return Value
sqrt returns the nearest internal representation to sqrt(x), expressed as a
double floating value. If x is negative, sqrt returns zero.
Example
To use sqrt to check whether n > 2 is a prime number:
if (!(n & 01))
return (NOTPRIME);
sq = sqrt((double)n);
for (div = 3; div <= sq; div += 2)
if (!(n % div))
return (NOTPRIME);
return (PRIME);
Notes
sqrt is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 147
4
C Library - srand
srand
Description
Seed pseudo-random number generator
Syntax
#include
void srand(unsigned char nseed)
Function
srand uses nseed as a seed for a new sequence of pseudo-random numbers to be returned by subsequent calls to rand. If srand is called with
the same seed value, the sequence of pseudo-random numbers will be
repeated. The initial seed value used by rand and srand is 1.
Return Value
Nothing.
Example
To set up a new sequence of random numbers:
srand(103);
See Also
rand
Notes
srand is packaged in the integer library.
148 Using The Compiler
© 2007 COSMIC Software
C Library - strcat
strcat
Description
Concatenate strings
Syntax
#include
char *strcat(char *s1, char *s2)
Function
strcat appends a copy of the NUL terminated string at s2 to the end of
the NUL terminated string at s1. The first character of s2 overlaps the
NUL at the end of s1. A terminating NUL is always appended to s1.
Return Value
strcat returns s1.
Example
To place the strings “first string, second string” in buf[]:
buf[0] = '\0';
strcpy(buf, “first string”);
strcat(buf, “, second string”);
See Also
strncat
Notes
There is no way to specify the size of the destination area to prevent
storage overwrites.
strcat is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 149
4
C Library - strchr
strchr
Description
Scan string for first occurrence of character
Syntax
#include
char *strchr(char *s1, char c)
Function
strchr looks for the first occurrence of a specific character c in a NUL
terminated target string s.
Return Value
strchr returns a pointer to the first character that matches c, or NULL if
none does.
Example
To map keystr[] characters into subst[] characters:
if (t = strchr(keystr, *s))
*s = subst[t - keystr];
See Also
memchr, strcspn, strpbrk, strrchr, strspn
Notes
strchr is packaged in the integer library.
150 Using The Compiler
© 2007 COSMIC Software
C Library - strcmp
strcmp
Description
Compare two strings for lexical order
Syntax
#include
int strcmp(char *s1, char *s2)
Function
strcmp compares two text strings, character by character, for lexical
order in the character collating sequence. The first string starts at s1, the
second at s2. The strings must match, including their terminating NUL
characters, in order for them to be equal.
Return Value
strcmp returns an integer greater than, equal to, or less than zero,
according to whether s1 is lexicographically greater than, equal to, or
less than s2.
Example
To look for the string “include”:
if (strcmp(buf, “include”) == 0)
doinclude();
See Also
memcmp, strncmp
Notes
strcmp is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 151
4
C Library - strcpy
strcpy
Description
Copy one string to another
Syntax
#include
char *strcpy(char *s1, char *s2)
Function
strcpy copies the NUL terminated string at s2 to the buffer pointed at
by s1. The terminating NUL is also copied.
Return Value
strcpy returns s1.
Example
To make a copy of the string s2 in dest:
strcpy(dest, s2);
See Also
memcpy, strncpy
Notes
There is no way to specify the size of the destination area, to prevent
storage overwrites.
strcpy is packaged in the integer library, and may be implemented as an
inline function.
152 Using The Compiler
© 2007 COSMIC Software
C Library - strcspn
strcspn
Description
Find the end of a span of characters in a set
Syntax
#include
unsigned int strcspn(char *s1, char *s2)
Function
strcspn scans the string starting at s1 for the first occurrence of a character in the string starting at s2. It computes a subscript i such that:
•
s1[i] is a character in the string starting at s1
•
s1[i] compares equal to some character in the string starting at s2,
which may be its terminating null character.
Return Value
strcspn returns the lowest possible value of i. s1[i] designates the terminating null character if none of the characters in s1 are in s2.
Example
To find the start of a decimal constant in a text string:
if (!str[i = strcspn(str, “0123456789+-”)])
printf(“can't find number\n”);
See Also
memchr, strchr, strpbrk, strrchr, strspn
Notes
strcspn is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 153
4
C Library - strlen
strlen
Description
Find length of a string
Syntax
#include
unsigned int strlen(char *s)
Function
strlen scans the text string starting at s to determine the number of characters before the terminating NUL.
Return Value
The value returned is the number of characters in the string before the
NUL.
Notes
strlen is packaged in the integer library and may be implemented as an
inline function.
154 Using The Compiler
© 2007 COSMIC Software
C Library - strncat
strncat
Description
Concatenate strings of length n
Syntax
#include
char *strncat(char *s1, char *s2, unsigned char n)
Function
strncat appends a copy of the NUL terminated string at s2 to the end of
the NUL terminated string at s1. The first character of s2 overlaps the
NUL at the end of s1. n specifies the maximum number of characters to
be copied, unless the terminating NUL in s2 is encountered first. A terminating NUL is always appended to s1.
Return Value
strncat returns s1.
Example
To concatenate the strings “day” and “light”:
strcpy(s, “day”);
strncat(s + 3, “light”, 5);
See Also
strcat
Notes
strncat is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 155
4
C Library - strncmp
strncmp
Description
Compare two n length strings for lexical order
Syntax
#include
int strncmp(char *s1, char *s2, unsigned char n)
Function
strncmp compares two text strings, character by character, for lexical
order in the character collating sequence. The first string starts at s1, the
second at s2. n specifies the maximum number of characters to be compared, unless the terminating NUL in s1 or s2 is encountered first. The
strings must match, including their terminating NUL character, in order
for them to be equal.
Return Value
strncmp returns an integer greater than, equal to, or less than zero,
according to whether s1 is lexicographically greater than, equal to, or
less than s2.
Example
To check for a particular error message:
if (strncmp(errmsg,
“can't write output file”, 23) == 0)
cleanup(errmsg);
See Also
memcmp, strcmp
Notes
strncmp is packaged in the integer library.
156 Using The Compiler
© 2007 COSMIC Software
C Library - strncpy
strncpy
Description
Copy n length string
Syntax
#include
char *strncpy(char *s1, char *s2, unsigned char n)
Function
strncpy copies the first n characters starting at location s2 into the
buffer beginning at s1. n specifies the maximum number of characters
to be copied, unless the terminating NUL in s2 is encountered first. In
that case, additional NUL padding is appended to s2 to copy a total of n
characters.
Return Value
strncpy returns s1.
Example
To make a copy of the string s2 in dest:
strncpy(dest, s2, n);
See Also
memcpy, strcpy
Notes
If the string s2 points at is longer than n characters, the result may not
be NUL-terminated.
strncpy is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 157
4
C Library - strpbrk
strpbrk
Description
Find occurrence in string of character in set
Syntax
#include
char *strpbrk(char *s1, char *s2)
Function
strpbrk scans the NUL terminated string starting at s1 for the first
occurrence of a character in the NUL terminated set s2.
Return Value
strpbrk returns a pointer to the first character in s1 that is also contained
in the set s2, or a NULL if none does.
Example
To replace unprintable characters (as for a 64 character terminal):
while (string = strpbrk(string, “‘{|}~”))
*string = '@';
See Also
memchr, strchr, strcspn, strrchr, strspn
Notes
strpbrk is packaged in the integer library.
158 Using The Compiler
© 2007 COSMIC Software
C Library - strrchr
strrchr
Description
Scan string for last occurrence of character
Syntax
#include
char *strrchr(char *s, char c)
Function
strrchr looks for the last occurrence of a specific character c in a NUL
terminated string starting at s.
Return Value
strrchr returns a pointer to the last character that matches c, or NULL if
none does.
Example
To find a filename within a directory pathname:
if (s = strrchr(“/usr/lib/libc.user”, '/')
++s;
See Also
memchr, strchr, strpbrk, strcspn, strspn
Notes
strrchr is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 159
4
C Library - strspn
strspn
Description
Find the end of a span of characters not in set
Syntax
#include
unsigned int strspn(char *s1, char *s2)
Function
strspn scans the string starting at s1 for the first occurrence of a character not in the string starting at s2. It computes a subscript i such that
•
s1[i] is a character in the string starting at s1
•
s1[i] compares equal to no character in the string starting at s2,
except possibly its terminating null character.
Return Value
strspn returns the lowest possible value of i. s1[i] designates the terminating null character if all of the characters in s1 are in s2.
Example
To check a string for characters other than decimal digits:
if (str[strspn(str, “0123456789”)])
printf(“invalid number\n”);
See Also
memchr, strcspn, strchr, strpbrk, strrchr
Notes
strspn is packaged in the integer library.
160 Using The Compiler
© 2007 COSMIC Software
C Library - strstr
strstr
Description
Scan string for first occurrence of string
Syntax
#include
char *strstr(char *s1, char *s2)
Function
strstr looks for the first occurrence of a specific string s2 not including
its terminating NUL, in a NUL terminated target string s1.
Return Value
strstr returns a pointer to the first character that matches c, or NULL if
none does.
Example
To look for a keyword in a string:
if (t = strstr(buf, “LIST”))
do_list(t);
See Also
memchr, strcspn, strpbrk, strrchr, strspn
Notes
strstr is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 161
4
C Library - strtod
strtod
Description
Convert buffer to double
Syntax
#include
double strtod(char *nptr, char **endptr)
Function
strtod converts the string at nptr into a double. The string is taken as
the text representation of a decimal number, with an optional fraction
and exponent. Leading whitespace is skipped and an optional sign is
permitted; conversion stops on the first unrecognizable character.
Acceptable inputs match the pattern:
[+|-]d*[.d*][e[+|-]dd*]
where d is any decimal digit and e is the character ‘e’ or ‘E’. If endptr is
not a null pointer, *endptr is set to the address of the first unconverted
character remaining in the string nptr. No checks are made against overflow, underflow, or invalid character strings.
Return Value
strtod returns the converted double value. If the string has no recognizable characters, it returns zero.
Example
To read a string from STDIN and convert it to a double at d:
gets(buf);
d = strtod(buf, NULL);
See Also
atoi, atol, strtol, strtoul
Notes
strtod is packaged in the floating point library.
162 Using The Compiler
© 2007 COSMIC Software
C Library - strtol
strtol
Description
Convert buffer to long
Syntax
#include
long strtol(char *nptr, char **endptr, char base)
Function
strtol converts the string at nptr into a long integer. Leading whitespace
is skipped and an optional sign is permitted; conversion stops on the
first unrecognizable character. If base is not zero, characters a-z or A-Z
represents digits in range 10-36. If base is zero, a leading “0x” or “0X”
in the string indicates hexadecimal, a leading “0” indicates octal, otherwise the string is take as a decimal representation. If base is 16 and a
leading “0x” or “0X” is present, it is skipped before to convert. If
endptr is not a null pointer, *endptr is set to the address of the first
unconverted character in the string nptr.
No checks are made against overflow or invalid character strings.
Return Value
strtol returns the converted long integer. If the string has no recognizable characters, zero is returned.
Example
To read a string from STDIN and convert it to a long l:
gets(buf);
l = strtol(buf, NULL, 0);
See Also
atof, atoi, strtoul, strtod
Notes
strtol is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 163
4
C Library - strtoul
strtoul
Description
Convert buffer to unsigned long
Syntax
#include
unsigned long strtoul(char *nptr, char **endptr,
char base)
Function
strtoul converts the string at nptr into a long integer. Leading
whitespace is skipped and an optional sign is permitted; conversion
stops on the first unrecognizable character. If base is not zero, characters a-z or A-Z represents digits in range 10-36. If base is zero, a leading “0x” or “0X” in the string indicates hexadecimal, a leading “0”
indicates octal, otherwise the string is take as a decimal representation.
If base is 16 and a leading “0x” or “0X” is present, it is skipped before
to convert. If endptr is not a null pointer, *endptr is set to the address of
the first unconverted character in the string nptr.
No checks are made against overflow or invalid character strings.
Return Value
strtoul returns the converted long integer. If the string has no recognizable characters, zero is returned.
Example
To read a string from STDIN and convert it to a long l:
gets(buf);
l = strtoul(buf, NULL, 0);
See Also
atof, atoi, strtol, strtod
Notes
strtoul is a macro redefined to strtol.
164 Using The Compiler
© 2007 COSMIC Software
C Library - tan
tan
Description
Tangent
Syntax
#include
double tan(double x)
Function
tan computes the tangent of x, expressed in radians, to full double precision.
Return Value
tan returns the nearest internal representation to tan(x), in the range
[-pi/2, pi/2], expressed as a double floating value. If the number in x is
too large to be represented, tan returns zero. An argument with a large
size may return a meaningless value, i.e. when x/(2 * pi) has no fraction
bits.
Example
To compute the tangent of theta:
y = tan(theta);
See Also
cos, sin
Notes
tan is packaged in the floating point library.
© 2007 COSMIC Software
Using The Compiler 165
4
C Library - tanh
tanh
Description
Hyperbolic tangent
Syntax
#include
double tanh(double x)
Function
tanh computes the value of the hyperbolic tangent of x to double precision.
Return Value
tanh returns the nearest internal representation to tanh(x), expressed as
a double floating value. If the result is too large to be properly represented, tanh returns zero.
Example
To compute the hyperbolic tangent of x:
y = tanh(x);
See Also
cosh, exp, sinh
Notes
tanh is packaged in the floating point library.
166 Using The Compiler
© 2007 COSMIC Software
C Library - tolower
tolower
Description
Convert character to lowercase if necessary
Syntax
#include
int tolower(char c)
Function
tolower converts an uppercase letter to its lowercase equivalent, leaving all other characters unmodified.
Return Value
tolower returns the corresponding lowercase letter, or the unchanged
character.
Example
To accumulate a hexadecimal digit:
for (sum = 0; isxdigit(*s); ++s)
if (isdigit(*s)
sum = sum * 16 + *s - '0';
else
sum = sum * 16 + tolower(*s) + (10 - 'a');
See Also
toupper
Notes
tolower is packaged in the integer library.
© 2007 COSMIC Software
Using The Compiler 167
4
C Library - toupper
toupper
Description
Convert character to uppercase if necessary
Syntax
#include
int toupper(char c)
Function
toupper converts a lowercase letter to its uppercase equivalent, leaving
all other characters unmodified.
Return Value
toupper returns the corresponding uppercase letter, or the unchanged
character.
Example
To convert a character string to uppercase letters:
for (i = 0; i < size; ++i)
buf[i] = toupper(buf[i]);
See Also
tolower
Notes
toupper is packaged in the integer library.
168 Using The Compiler
© 2007 COSMIC Software
CHAPTER
5
Using The Assembler
The castm8 cross assembler translates your assembly language source
files into relocatable object files. The C cross compiler calls castm8 to
assemble your code automatically, unless specified otherwise. castm8
generates also listings if requested. This chapter includes the following
sections:
•
Invoking castm8
•
Object File
•
Listings
•
Assembly Language Syntax
•
Branch Optimization
•
Old Syntax
•
C Style Directives
•
Assembler Directives
© 2007 COSMIC Software
Using The Assembler 169
5
Invoking castm8
Invoking castm8
castm8 accepts the following command line options, each of which is
described in detail below:
castm8 [options]
-a
absolute assembler
-b
do not optimizes branches
-c
output cross reference
-d*> define symbol=value
+e* error file name
-ff use formfeed in listing
-ft force title in listing
-f# fill byte value
-h* include header
-i*> include path
-l
output listing
+l* listing file name
-m
accept old syntax
-mi accept label syntax
-o* output file name
-pe all equates public
-p
all symbols public
-pl keep local symbol
-u
undefined in listing
-v
be verbose
-x
include line debug info
-xp no path in debug info
-xx include full debug info
Castm8 Option Usage
Option
Description
-a
map all sections to absolute, including the predefined ones.
-b
do not optimize branch instructions. By default, the assembler replaces long branches by short branches wherever a
shorter instruction can be used, and short branches by long
branches wherever the displacement is too large. This optimization also applies to jump and jump to subroutines
instructions.
170 Using The Assembler
© 2007 COSMIC Software
Invoking castm8
Castm8 Option Usage (cont.)
Option
Description
-c
produce cross-reference information. The cross-reference
information will be added at the end of the listing file. This
option enforces the -l option.
-d*>
where * has the form name=value, defines name to have
the value specified by value. This option is equivalent to
using an equ directive in each of the source files.
+e*
log errors from assembler in the text file * instead of displaying the messages on the terminal screen.
-ff
use formfeed character to skip pages in listing instead of
using blank lines.
-ft
output a title in listing (date, file name, page). By default, no
title is output.
-f#
define the value of the filling byte used to fill any gap created by the assembler directives. Default is 0.
-h*
include the file specified by * before starting assembly. It is
equivalent to an include directive in each source file.
-i*>
define a path to be used by the include directive. Up to 20
paths can be defined. A path is a directory name and is not
ended by any directory separator character.
-l
create a listing file. The name of the listing file is derived
from the input file name by replacing the suffix by the ‘.ls’
extension, unless the +l option has been specified.
+l*
create a listing file in the text file *. If both -l and +l are specified, the listing file name is given by the +l option.
-m
accept the old syntax.
-mi
accept label that is not ended with a ‘:’ character.
-o*
write object code to the file *. If no file name is specified, the
output file name is derived from the input file name, by
replacing the rightmost extension in the input file name with
the character ‘o’. For example, if the input file name is
prog.s, the default output file name is prog.o.
© 2007 COSMIC Software
Using The Assembler 171
5
Object File
Castm8 Option Usage (cont.)
Option
Description
-pe
mark all symbols defined by an equ directive as public.
This option has the same effect than adding a xdef directive
for each of those symbols.
-pl
put locals in the symbol table. They are not published as
externals and will be only displayed in the linker map file.
-p
mark all defined symbols as public. This option has the
same effect than adding a xdef directive for each label.
-u
produce an error message in the listing file for all occurrence of an undefined symbol. This option enforces the -l
option.
-v
display the name of each file which is processed.
-x
add line debug information to the object file.
-xp
do not prefix filenames in the debug information with any
absolute path name. Debuggers will have to be informed
about the actual files location.
-xx
add debug information in the object file for any label defining code or data. This option disables the -p option as only
public or used labels are selected.
Each source file specified by will be assembled separately, and
will produce separate object and listing files. For each source file, if no
errors are detected, castm8 generates an object file. If requested by the l or -c options, castm8 generates a listing file even if errors are detected.
Such lines are followed by an error message in the listing.
Object File
The object file produced by the assembler is a relocatable object in a
format suitable for the linker clnk. This will normally consist of
machine code, initialized data and relocation information. The object
file also contains information about the sections used, a symbol table,
and a debug symbol table.
172 Using The Assembler
© 2007 COSMIC Software
Listings
Listings
The listing stream contains the source code used as input to the assembler, together with the hexadecimal representation of the corresponding
object code and the address for which it was generated. The contents of
the listing stream depends on the occurrence of the list, nolist, clist,
dlist and mlist directives in the source. The format of the output is as
follows:
where is the hexadecimal relocatable address where the
has been assembled, is the hexadecimal representation of the object code generated by the assembler and
is the original source line input to the assembler. If
expansion of data, macros and included files is not enabled, the
print will not contain a complete listing of all generated code.
Addresses in the listing output are the offsets from the start of the current section. After the linker has been executed, the listing files may be
updated to contain absolute information by the clabs utility. Addresses
and code will be updated to reflect the actual values as built by the
linker.
Several directives are available to modify the listing display, such as
title for the page header, plen for the page length, page for starting a
new page, tabs for the tabulation characters expansion. By default, the
listing file is not paginated. Pagination is enabled by using at least one
title directive in the source file, or by specifying the -ft option on the
command line. Otherwise, the plen and page directives are simply
ignored. Some other directives such as clist, mlist or dlist control the
amount of information produced in the listing.
A cross-reference table will be appended to the listing if the -c option
has been specified. This table gives for each symbol its value, its
attributes, the line number of the line where it has been defined, and the
list of line numbers where it is referenced.
© 2007 COSMIC Software
Using The Assembler 173
5
Assembly Language Syntax
Assembly Language Syntax
The assembler castm8 conforms to the STM8 syntax as described in the
document Assembly Language Input Standard. The assembly language
consists of lines of text in the form:
[label:] [command [operands]] [; comment]
or
; comment
where ‘:’ indicates the end of a label and ‘;’ defines the start of a comment. The end of a line terminates a comment. The command field may
be an instruction, a directive or a macro call.
Instruction mnemonics and assembler directives may be written in
upper or lower case. The C compiler generates lowercase assembly language.
A source file must end with the end directive. All the following lines
will be ignored by the assembler. If an end directive is found in an
included file, it stops only the process for the included file.
Instructions
castm8 recognizes the following instructions:
adc
add
addw
and
bccm
bcp
bcpl
bkpt
bres
bset
btjf
btjt
call
callf
callr
ccf
clr
clrw
cp
cpl
cplw
cpw
dec
decw
div
divw
exg
exgw
halt
inc
174 Using The Assembler
incw
iret
jp
jpf
jra
jrc
jreq
jrf
jrh
jrih
jril
jrm
jrmi
jrnc
jrne
jrnh
jrnm
jrnv
jrpl
jrsge
jrsgt
jrsle
jrslt
jrt
jruge
jrugt
jrule
jrult
jrv
ld
ldf
ldw
mov
mul
neg
negw
nop
or
pop
popw
push
pushw
rcf
ret
retf
rim
rlc
rlcw
rlwa
rrc
rrcw
rrwa
rvf
sbc
scf
sim
sla
slaw
sll
sllw
sra
sraw
srl
srlw
sub
subw
swap
swapw
tnz
tnzw
trap
wfe
wfi
xor
© 2007 COSMIC Software
Assembly Language Syntax
The operand field of an instruction uses an addressing mode to
describe the instruction argument. The following examples demonstrate
the accepted syntax:
rcf
push
ld
and
ld
ld
ld
jrne
bset
btjt
y
a,#1
a,var
a,(2,x)
a,[var]
a,([var.w],y)
loop
2,#1
2,#1,loop
;
;
;
;
;
;
;
;
;
;
implicit
register
immediate
short, long
indexed
indirect
indirect indexed long
relative
bit number
bit test and branch
The assembler chooses the smallest addressing mode where several
solutions are possible. Short addressing mode is selected when using a
label defined in the .bsct section.
For an exact description of the above instructions, refer to the ST
Microelectronics’s STM8 Family Programming Manual.
Labels
A source line may begin with a label. Some directives require a label on
the same line, otherwise this field is optional. A label must begin with
an alphabetic character, the underscore character ‘_’ or the period character ‘.’. It is continued by alphabetic (A-Z or a-z) or numeric (0-9)
characters, underscores, dollar signs ($) or periods. Labels are case sensitive. The processor register names ‘a’ and ‘x’ are reserved and cannot
be used as labels.
data1: dc.b
c_reg: ds.b
$56
1
When a label is used within a macro, it may be expanded more than
once and in that case, the assembler will fail with a multiply defined
symbol error. In order to avoid that problem, the special sequence ‘\@’
may be used as a label prefix. This sequence will be replaced by a
unique sequence for each macro expansion. This prefix is only allowed
inside a macro definition.
© 2007 COSMIC Software
Using The Assembler 175
5
Assembly Language Syntax
wait: macro
\@loop:btjf
endm
PORTA,#1,\@loop
Temporary Labels
The assembler allows temporary labels to be defined when there is no
need to give them an explicit name. Such a label is composed by a decimal number immediately followed by a ‘$’ character. Such a label is
valid until the next standard label or the local directive. Then the same
temporary label may be redefined without getting a multiply defined
error message.
1$:
2$:
dec
jrne 1$
dec
jrne 2$
Temporary labels do not appear in the symbol table or the cross reference list.
For example, to define 3 different local blocks and create and use 3 different local labels named 10$:
function1:
10$:
ld
jreq
ld
local
10$:
ld
jreq
ld
ret
function2:
10$:
ld
sub
jrne
ret
a,var
10$
a,var2
a,var2
10$
a,var
a,var2
a,var
10$
Constants
The assembler accepts numeric constants and string constants.
Numeric constants are expressed in different bases depending on a prefix character as follows:
176 Using The Assembler
© 2007 COSMIC Software
Assembly Language Syntax
Number
10
%1010
@12
$A
Base
decimal (no prefix)
binary
octal
hexadecimal
The assembler also accepts numerics constants in different bases
depending on a suffix character as follow:
Suffix
D, d or none
Base
decimal (no prefix)
B or b
binary
Q or q
octal
0AH or 0Ah
hexadecimal
The suffix letter can be entered uppercase or lowercase. Hexadecimal
numbers still need to start with a digit.
String constants are a series of printable characters between single or
double quote characters:
‘This is a string’
“This is also a string”
Depending on the context, a string constant will be seen either as a
series of bytes, for a data initialization, or as a numeric; in which case,
the string constant should be reduced to only one character.
hexa: dc.b
start: cp
© 2007 COSMIC Software
‘0123456789ABCDEF’
x,#’A’ ; ASCII value of ‘A’
Using The Assembler 177
5
Assembly Language Syntax
Expressions
An expression consists of a number of labels and constants connected
together by operators. Expressions are evaluated to 32-bit precision.
Note that operators have the same precedence than in the C language.
A special label written ‘*’ is used to represent the current location
address. Note that when ‘*’ is used as the operand of an instruction, it
has the value of the program counter before code generation for that
instruction. The set of accepted operators is:
+
*
/
%
&
|
^
~
<<
>>
==
!=
<
<=
>
>=
&&
||
!
addition
subtraction (negation)
multiplication
division
remainder (modulus)
bitwise and
bitwise or
bitwise exclusive or
bitwise complement
left shift
right shift
equality
difference
less than
less than or equal
greater than
greater than or equal
logical and
logical or
logical complement
These operators may be applied to constants without restrictions, but
are restricted when applied to relocatable labels. For those labels, the
addition and substraction operators only are accepted and only in the
following cases:
label + constant
label - constant
label1 - label2
NOTE
The difference of two relocatable labels is valid only if both symbols are
not external symbols, and are defined in the same section.
178 Using The Assembler
© 2007 COSMIC Software
Assembly Language Syntax
An expression may also be constructed with a special operator. These
expressions cannot be used with the previous operators and have to be
specified alone.
high(expression)
low(expression)
page(expression)
upper byte
lower byte
page byte
These special operators evaluate an expression and extract the appropriate information from the result. The expression may be relocatable,
and may use the set of operators if allowed.
high - extract the upper byte of the 16-bit expression
low - extract the lower byte of the 16-bit expression
page - extract the page value of the expression. It is computed by the
linker according to the -bs option used. This is used to get the address
extension when bank switching is used.
Macro Instructions
A macro instruction is a list of assembler commands collected under a
unique name. This name becomes a new command for the following of
the program. A macro begins with a macro directive and ends with a
endm directive. All the lines between these two directives are recorded
and associated with the macro name specified with the macro directive.
signex:macro
clr
tnz
jrpl
cpl
\@pos:
endm
x
a
\@pos
x
;
;
;
;
;
sign extension
prepare MSB
test sign
if not positive
invert MSB
; end of macro
This macro is named signex and contains the code needed to perform a
sign extension of a into x. Whenever needed, this macro can be
expanded just by using its name in place of a standard instruction:
ld
signex
ld
© 2007 COSMIC Software
a,char+1 ; load LSB
; expand macro
char,x ; store result
Using The Assembler 179
5
Assembly Language Syntax
The resulting code will be the same as if the following code had been
written:
ld
clr
tnz
jrpl
cpl
a,char+1 ;
x
;
a
;
pos
;
x
;
ld
char,x
load LSB
prepare MSB
test sign
if not positive
invert MSB
pos:
; store result
A macro may have up to 35 parameters. A parameter is written \1,
\2,... \9, \A,...,\Z inside the macro body and refers explicitly to the first,
second,... ninth argument and \A to \Z to denote the tenth to 35th operand on the invocation line, which are placed after the macro name, and
separated by commas. Each argument replaces each occurrence of its
corresponding parameter. An argument may be expressed as a string
constant if it contains a comma character.
A macro can also handle named arguments instead of numbered argument. In such a case, the macro directive is followed by a list of argument named, each prefixed by a \ character, and separated by commas.
Inside the macro body, arguments will be specified using the same syntax or a sequence starting by a \ character followed by the argument
named placed between parenthesis. This alternate syntax is useful to
catenate the argument with a text string immediately starting with
alphanumeric characters.
The special parameter \# is replaced by a numeric value corresponding
to the number of arguments actually found on the invocation line.
In order to operate directly in memory, the previous macro may have
been written using the numbered syntax:
signex:macro
clr
ld
jrpl
cpl
\@pos:
ld
endm
180 Using The Assembler
x
a,\1
\@pos
x
\1,x
;
;
;
;
;
sign extension
prepare MSB
load LSB
if not positive
invert MSB
; store MSB
; end of macro
© 2007 COSMIC Software
Assembly Language Syntax
And called:
signex char
; sign extend char
This macro may also be written using the named syntax:
signex:macro
clr
ld
jrpl
cpl
\@pos:
ld
endm
\value
x
a,\value
\@pos
x
;
;
;
;
;
sign extension
prepare MSB
load LSB
if not positive
invert MSB
\(value),x
; store MSB
; end of macro
The form of a macro call is:
name>[.] []
The special parameter \0 corresponds to an extension which may
follow the macro name, separated by the period character ‘.’. An extension is a single letter which may represent the size of the operands and
the result. For example:
table: macro
dc.\0
endm
1,2,3,4
When invoking the macro:
table.b
will generate a table of byte:
dc.b
1,2,3,4
When invoking the macro:
table.w
will generate a table of word:
dc.w
© 2007 COSMIC Software
1,2,3,4
Using The Assembler 181
5
Assembly Language Syntax
The special parameter \* is replaced by a sequence containing the list of
all the passed arguments separated by commas. This syntax is useful to
pass all the macro arguments to another macro or a repeatl directive.
The directive mexit may be used at any time to stop the macro expansion. It is generally used in conjunction with a conditional directive.
A macro call may be used within another macro definition, all macros
must then be defined before their first call. A macro definition cannot
contain another macro definition.
If a listing is produced, the macro expansion lines are printed if enabled
by the mlist directive. If enabled, the invocation line is not printed, and
all the expanded lines are printed with all the parameters replaced by
their corresponding arguments. Otherwise, the invocation line only is
printed.
Conditional Directives
A conditional directive allows parts of the program to be assembled or
not depending on a specific condition expressed in an if directive. The
condition is an expression following the if command. The expression
cannot be relocatable, and shall evaluate to a numeric result. If the condition is false (expression evaluated to zero), the lines following the if
directive are skipped until an endif or else directive. Otherwise, the
lines are normally assembled. If an else directive is encountered, the
condition status is reversed, and the conditional process continues until
the next endif directive.
if
ld
call
endif
debug == 1
x,#message
print
If the symbol debug is equal to 1, the next two lines are assembled.
Otherwise they are skipped.
if
addptr
else
inc
endif
182 Using The Assembler
offset != 1
offset
x
;
;
;
;
if offset too large
call a macro
otherwise
increment X register
© 2007 COSMIC Software
Assembly Language Syntax
If the symbol offset is not one, the macro addptr is expanded with offset as argument, otherwise the aix instruction is directly assembled.
Conditional directives may be nested. An else directive refers to the
closest previous if directive, and an endif directive refers to the closest
previous if or else directive.
If a listing is produced, the skipped lines are printed only if enabled by
the clist directive. Otherwise, only the assembled lines are printed.
Sections
The assembler allows code and data to be splitted in sections. A section
is a set of code or data referenced by a section name, and providing a
contiguous block of relocatable information. A section is defined with a
section directive, which creates a new section and redirects the following code and data thereto. The directive switch can be used to redirect
the following code and data to another section.
data: section
text: section
start:
ld
jp
switch
value:
dc.b
; defines data section
; defines text section
x,#value ; fills text section
print
data
; use now data section
1,2,3
; fills data section
The assembler allows up to 255 different sections. A section name is
limited to 15 characters. If a section name is too long, it is simply truncated without any error message.
The assembler predefines the following sections, meaning that a section
directive is not needed before to use them:
© 2007 COSMIC Software
Using The Assembler 183
5
Assembly Language Syntax
Section
Description
.text
executable code
.data
initialized data
.bss
uninitialized data
.bsct
initialized data in zero page
.ubsct
non initialized data in zero page
The sections .bsct and .ubsct are used for locating data in the zero page
of the processor. The zero page is defined as the memory addresses
between 0x00 and 0xFF inclusive, i.e. the memory directly addressable
by a single byte. Several processors include special instructions and/or
addressing modes that take advantage of this special address range. The
Cosmic assembler will automatically use the most efficient addressing
mode if the data objects are allocated in the .bsct, .ubsct or a section
with the same attributes. If zero page data objects are defined in another
file then the directive xref.b must be used to externally reference the
data object. This directive specifies that the address for these data
object is only one byte and therefore the assembler may use 8 bit
addressing modes.
switch
zvar2: ds.b
switch
var2: ds.b
switch
ld
ld
ld
ld
end
.bsct
1
.bss
1
.text
a,var
a,zvar
a,var2
a,var2
Bit Handling
The assembler allows symbols specifying bit addresses instead of byte
addresses. A bit address is obtained from a byte address and a bit
number by or’ing the bit number with the byte address 3-bit shifted to
the left. Such symbol can be defined either by an equate definition or as
member of a bit section. Such a section can be defined by using the sec-
184 Using The Assembler
© 2007 COSMIC Software
Assembly Language Syntax
tion directive with the bit attribute. In a bit section, any directive creating or reserving bytes can be used, but will create or reserve bits. Bit
symbols can be directly used by the bit instructions with a shortened
syntax, as a bit symbol is defining both a byte and a bit in this byte. Bit
symbols can be declared as external by using the xbit directive. External definitions for bit symbols located in the zero page will used the
xbit.b directive.
PA3:
.bit:
b0:
xbit.b
equ
section
ds.b
switch
btjf
bset
b1
; external bit declaration
PORTA:3 ; bit 3 of byte PORTA
zpage,bit; create bit section named “.bit”
1
; allocates one bit
.text
PA3,skip ; use directly bit symbol
b0
; with bit instructions
bres
b1
skip:
Bit sections are located at link time either at specified bit addresses or
attached to any zero page section. The linker is computing the proper
addresses when hooking bit sections to byte sections, or byte sections to
bit sections.
Includes
The include directive specifies a file to be included and assembled in
place of the include directive. The file name is written between double
quotes, and may be any character string describing a file on the host
system. If the file cannot be found using the given name, it is searched
from all the include paths defined by the -i options on the command
line, and from the paths defined by the environment symbol CXLIB, if
such a symbol has been defined before the assembler invocation. This
symbol may contain several paths separated by the usual path separator
of the host operating system (‘;’ for MSDOS and ‘:’ for UNIX).
The -h option can specify a file to be “included”. The file specified will
be included as if the program had an include directive at its very top.
The specified file will be included before any source file specified on
the command line.
© 2007 COSMIC Software
Using The Assembler 185
5
Branch Optimization
Branch Optimization
Branch instructions are by default automatically optimized to produce
the shortest code possible. This behaviour may be disabled by the -b
option. This optimization operates on conditional branches, on jumps
and jumps to subroutine.
A conditional branch offset is limited to the range [-128,127]. If such an
instruction cannot be encoded properly, the assembler will replace it by
a sequence containing an inverted branch to the next location followed
immediately by a jump to the original target address. The assembler
keep track of the last replacement for each label, so if a long branch has
already been expanded for the same label at a location close enough
from the current instruction, the target address of the short branch will
be changed only to branch on the already existing jump instruction to
the specified label.
jreq
farlabel
becomes
jrne
jp
*+5
farlabel
Note that a jra instruction will be replaced by a single jp instruction if it
cannot be encoded as a relative branch.
A jp or call instruction will be replaced by a jra or callr instruction if
the destination address is in the same section than the current one, and if
the displacement is in the range allowed by a relative branch.
Old Syntax
The -m option allows the assembler to accept old constructs which are
now obsolete. The following features are added to the standard behaviour:
•
a comment line may begin with a ‘*’ character;
•
a label starting in the first column does not need to be ended with
a ‘:’ character;
•
no error message is issued if an operand of the dc.b directive is
too large;
•
the section directive handles numbered sections;
186 Using The Assembler
© 2007 COSMIC Software
C Style Directives
The comment separator at the end of an instruction is still the ‘;’ character because the ‘*’ character is interpreted as the multiply operator.
C Style Directives
The assembler also supports C style directives matching the preprocessor directives of a C compiler. The following directives list shows the
equivalence with the standard directives:
C Style
Assembler Style
#include “file”
include “file”
#define label expression
label:
equ expression
#define label
label:
equ 1
#if expression
if expression
#ifdef label
ifdef label
#ifndef label
ifndef label
#else
else
#endif
endif
#error “message”
fail “message”
NOTE
The #define directive does not implement all the text replacement features provided by a C compiler. It can be used only to define a symbol
equal to a numerical value.
Assembler Directives
This section consists of quick reference descriptions for each of the
castm8 assembler directives.
© 2007 COSMIC Software
Using The Assembler 187
5
Assembler Directives - align
align
Description
Align the next instruction on a given boundary
Syntax
align ,[]
Function
The align directive forces the next instruction to start on a specific
boundary. The align directive is followed by a constant expression
which must be positive. The next instruction will start at the next
address which is a multiple of the specified value. If bytes are added in
the section, they are set to the value of the filling byte defined by the -f
option. If is specified, it will be used locally as the filling
byte, instead of the one specified by the -f option.
Example
align
ds.b
3
1
; next address is multiple of 3
See Also
even
188 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - base
base
Description
Define the default base for numerical constants
Syntax
base
Function
The base directive sets the default base for numerical constants beginning with a digit. The base directive is followed by a constant expression which value must be one of 2, 8, 10 or 16. The decimal base is used
by default. When another base is selected, it is no more possible to enter
decimal constants.
Example
base
ld
© 2007 COSMIC Software
8
a,#377
; select octal base
; load $FF
Using The Assembler 189
5
Assembler Directives - bsct
bsct
Description
Switch to the predefined .bsct section.
Syntax
bsct
Function
The bsct directive switches input to a section named .bsct, also known
as the zero page section. The assembler will automatically select the
short addressing mode when referencing an object defined in the .bsct
section.
Example
bsct
c_reg:
ds.b
1
Notes
The .bsct section is limited to 256 bytes, but the assembler does not
check the .bsct section size. This will be done by the linker.
See Also
section, switch
190 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - clist
clist
Description
Turn listing of conditionally excluded code on or off.
Syntax
clist [on|off]
Function
The clist directive controls the output in the listing file of conditionally
excluded code. It is effective if and only if listings are requested; it is
ignored otherwise.
The parts of the program to be listed are the program lines which are not
assembled as a consequence of if, else and endif directives.
See Also
if, else, endif
© 2007 COSMIC Software
Using The Assembler 191
5
Assembler Directives - dc
dc
Description
Allocate constant(s)
Syntax
dc[.size] [,...]
Function
The dc directive allocates and initializes storage for constants. If
is a string constant, one byte is allocated for each character of the string. Initialization can be specified for each item by giving a
series of values separated by commas or by using a repeat count.
The dc and dc.b directives will allocate one byte per .
The dc.w directive will allocate one word per .
The dc.l directive will allocate one long word per .
Example
digit: dc.b
dc.w
Note
10,'0123456789'
digit
For compatibility with previous assemblers, the directive fcb is alias to
dc.b, and the directive fdb is alias to dc.w.
192 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - dcb
dcb
Description
Allocate constant block
Syntax
dcb. ,
Function
The dcb directive allocates a memory block and initializes storage for
constants. The size area is the number of the specified value of
. The memory area can be initialized with the specified.
The dcb and dcb.b directives will allocate one byte per .
The dcb.w directive will allocate one word per .
The dcb.l directive will allocate one long word per .
Example
digit: dcb.b
© 2007 COSMIC Software
10,5
; allocate 10 bytes,
; all initialized to 5
Using The Assembler 193
5
Assembler Directives - dlist
dlist
Description
Turn listing of debug directives on or off.
Syntax
dlist [on|off]
Function
The dlist directive controls the visibility of any debug directives in the
listing. It is effective if and only if listings are requested; it is ignored
otherwise.
194 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - ds
ds
Description
Allocate variable(s)
Syntax
ds[.size]
Function
The ds directive allocates storage space for variables. must be
an absolute expression. Bytes created are set to the value of the filling
byte defined by the -f option.
The ds and ds.b directives will allocate bytes.
The ds.w directive will allocate words.
The ds.l directive will allocate long words.
Example
ptlec: ds.b
ptecr: ds.b
chrbuf: ds.w
Note
2
2
128
For compatibility with previous assemblers, the directive rmb is alias
to ds.b.
© 2007 COSMIC Software
Using The Assembler 195
5
Assembler Directives - else
else
Description
Conditional assembly
Syntax
if
instructions
else
instructions
endc
Function
The else directive follows an if directive to define an alternative conditional sequence. It reverts the condition status for the following instructions up to the next matching endif directive. An else directive applies
to the closest previous if directive.
Example
if
addptr
else
inc
endif
Note
offset != 1
offset
x
;
;
;
;
if offset too large
call a macro
otherwise
increment X register
The else and elsec directives are equivalent and may used without distinction. They are provided for compatibility with previous assemblers.
See Also
if, endif, clist
196 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - elsec
elsec
Description
Conditional assembly
Syntax
if
instructions
elsec
instructions
endc
Function
The elsec directive follows an if directive to define an alternative conditional sequence. It reverts the condition status for the following instructions up to the next matching endc directive. An elsec directive applies
to the closest previous if directive.
Example
ifge
addptr
elsec
inc
endc
Note
offset-127
offset
x
;
;
;
;
if offset too large
call a macro
otherwise
increment X register
The elsec and else directives are equivalent and may used without distinction. They are provided for compatibility with previous assemblers.
See Also
if, endc, clist, else
© 2007 COSMIC Software
Using The Assembler 197
5
Assembler Directives - end
end
Description
Stop the assembly
Syntax
end
Function
The end directive stops the assembly process. Any statements following it are ignored. If the end directive is encountered in an included file,
it will stop the assembly process for the included file only.
198 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - endc
endc
Description
End conditional assembly
Syntax
if
instructions
endc
Function
The endc directive closes an if or elsec conditional directive. The
conditional status reverts to the one existing before entering the if
directives. The endc directive applies to the closest previous if or
elsec directive.
Example
ifge
addptr
elsec
inc
endc
Note
offset-127
offset
x
;
;
;
;
if offset too large
call a macro
otherwise
increment X register
The endc and endif directives are equivalent and may used without distinction. They are provided for compatibility with previous assemblers.
See Also
if, elsec, clist, end
© 2007 COSMIC Software
Using The Assembler 199
5
Assembler Directives - endif
endif
Description
End conditional assembly
Syntax
if
instructions
endif
Function
The endif directive closes an if, or else conditional directive. The conditional status reverts to the one existing before entering the if directive.
The endif directive applies to the closest previous if or else directive.
Example
if
addptr
else
inc
endif
Note
offset != 1
offset
x
;
;
;
;
if offset too large
call a macro
otherwise
increment X register
The endif and endc directives are equivalent and may used without distinction. They are provided for compatibility with previous assemblers.
See Also
if, else, clist
200 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - endm
endm
Description
End macro definition
Syntax
label: macro
endm
Function
The endm directive is used to terminate macro definitions.
Example
; define a macro that places the length of
; a string in a byte prior to the string
ltext:
ds.b
macro
\@2 - \@1
ds.b
\1
\@1:
\@2:
endm
See Also
mexit, macro
© 2007 COSMIC Software
Using The Assembler 201
5
Assembler Directives - endr
endr
Description
End repeat section
Syntax
repeat
endr
Function
The endr directive is used to terminate repeat sections.
Example
; shift a value n times
asln:
macro
repeat \1
sla
endr
endm
; use of above macro
asln 10
;shift 10 times
See Also
repeat, repeatl, rexit
202 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - equ
equ
Description
Give a permanent value to a symbol
Syntax
label: equ
Function
The equ directive is used to associate a permanent value to a symbol
(label). Symbols declared with the equ directive may not subsequently
have their value altered otherwise the set directive should be used.
must be either a constant expression, or a relocatable
expression involving a symbol declared in the same section as the current one.
The equ directive can also be used to define a bit symbol by suffixing
the defining expression with an absolute bit number. The expression
and the bit number are separated by a colon character ‘:’. The expression can be absolute or relocatable.
Example
false:
true:
tablen:
nul:
soh:
stx:
etx:
eot:
enq:
equ
equ
equ
equ
equ
equ
equ
equ
equ
0 ; initialize these values
1
tabfin - tabsta;compute table length
$0 ; define strings for ascii characters
$1
$2
$3
$4
$5
PORTB:
PB2:
equ $1
equ PORTB:2
See Also
lit, set
© 2007 COSMIC Software
Using The Assembler 203
5
Assembler Directives - even
even
Description
Assemble next byte at the next even address relative to the start of a
section.
Syntax
even [fill_]
Function
The even directive forces the next assembled byte to the next even
address. If a byte is added to the section, it is set to the value of the filling byte defined by the -f option. If is specified, it will be
used locally as the filling byte, instead of the one specified by the -f
option.
Example
vowtab: dc.b
even
tentab: dc.w
204 Using The Assembler
'aeiou'
; ensure aligned at even address
1, 10, 100, 1000
© 2007 COSMIC Software
Assembler Directives - fail
fail
Description
Generate error message.
Syntax
fail "string"
Function
The fail directive outputs “string” as an error message. No output file is
produced as this directive creates an assembly error. fail is generally
used with conditional directives.
Example
Max:
equ
ifge
fail
© 2007 COSMIC Software
512
value - Max
“Value too large”
Using The Assembler 205
5
Assembler Directives - if
if
Description
Conditional assembly
Syntax
if
instructions
endif
or
if
instructions
else
instructions
endif
Function
The if, else and endif directives allow conditional assembly. The if
directive is followed by a constant expression. If the result of the
expression is not zero, the following instructions are assembled up to
the next matching endif or else directive; otherwise, the following
instructions up to the next matching endif or else directive are skipped.
If the if statement ends with an else directive, the expression result is
inverted and the same process applies to the following instructions up to
the next matching endif. So, if the if expression was not zero, the
instructions between else and endif are skipped; otherwise, the instructions between else and endif are assembled. An else directive applies to
the closest previous if directive.
The if directives may be nested. The skipped lines may or may not be in
the listing depending on the clist directive status.
Example
if
addptr
else
inc
endif
offset != 1
offset
x
;
;
;
;
if offset too large
call a macro
otherwise
increment X register
See Also
else, endif, clist
206 Using The Assembler
© 2007 COSMIC Software
Assembler Directives - ifc
ifc
Description
Conditional assembly
Syntax
ifc , orifc ,
instructions
instructions
endc
elsec
instructions
endc
Function
The ifc, else and endc directives allow conditional assembly. The ifc
directive is followed by a constant expression. If and
are equals, the following instructions are assembled up to the
next matching endc or elsec directive; otherwise, the following instructions up to the next matching endc or elsec directive are skipped.
If the ifc statement ends with an elsec directive, the expression result is
inverted and the same process applies to the following instructions up to
the next matching endc. So, if the ifc expression was not zero, the
instructions between elsec and endc are skipped; otherwise, the instructions between elsec and endc are assembled. An elsec directive applies
to the closest previous if directive.
The if directives may be nested. The skipped lines may or may not be in
the listing depending on the clist directive status.
Example
ifc
ld
elsec
ld
endc
“hello”, \2
a,#45
; if “hello” equals argument
; load 45
; otherwise...
a,#0
See Also
elsec, endc, clist
© 2007 COSMIC Software
Using The Assembler 207
5
Assembler Directives - ifdef
ifdef
Description
Conditional assembly
Syntax
ifdef