C - Cross Compiler Users Guide - CX6812
C - Cross Compiler Users Guide - CX6812
5
Soft ware
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............................................................................ 11
Support for Bank Switching ..................................................... 12
Support for ROMable Code...................................................... 12
Support for eeprom ................................................................... 13
Chapter 2
Tutorial Introduction
Acia.c, Example file.................................................................. 16
Default Compiler Operation............................................... 17
Compiling and Linking............................................................. 18
Step 1: Compiling............................................................... 18
Step 2: Assembler............................................................... 19
Step 3: Linking ................................................................... 20
Step 4: Generating S-Records file ...................................... 22
Linking Your Application......................................................... 24
Generating Automatic Data Initialization................................. 25
Specifying Command Line Options ......................................... 27
Chapter 3
Programming Environments
Introduction............................................................................... 30
Modifying the Runtime Startup................................................ 31
(i)
Description of Runtime Startup Code ................................ 31
Initializing data in RAM........................................................... 32
The const and volatile Type Qualifiers..................................... 34
Performing Input/Output in C................................................... 36
Placing Data Objects in The Bss Section ................................. 36
Placing Data Objects in The Zero Page Section....................... 37
Setting Zero Page Size ....................................................... 37
Placing Data Objects in the EEPROM Space........................... 38
Redefining Sections .................................................................. 39
Inlining Functions..................................................................... 41
Optimizing boolean functions .................................................. 41
Referencing Absolute Addresses.............................................. 42
Accessing Internal Registers .................................................... 43
Inserting Inline Assembly Instructions..................................... 44
Inlining with pragmas......................................................... 44
Inlining with _asm.............................................................. 45
Writing Interrupt Handlers ....................................................... 47
Placing Addresses in Interrupt Vectors .................................... 47
Calling a Bank Switched Function ........................................... 48
Accessing Banked Data ............................................................ 51
Using Position Independent Code ............................................ 52
Fuzzy Logic Support ................................................................ 53
Interfacing C to Assembly Language ....................................... 53
Register Usage .......................................................................... 55
Stack Model........................................................................ 55
Stack Representation .......................................................... 56
Heap Management Control with the C Compiler..................... 57
Modifying The Heap Location........................................... 59
Data Representation.................................................................. 62
Chapter 4
Using The Compiler
Invoking the Compiler.............................................................. 66
Compiler Command Line Options ..................................... 67
File Naming Conventions......................................................... 72
Generating Listings................................................................... 73
Generating an Error File ........................................................... 73
Return Status............................................................................. 73
Examples .................................................................................. 73
C Library Support ..................................................................... 74
How C Library Functions are Packaged............................. 74
Inserting Assembler Code Directly .................................... 74
(ii)
Linking Libraries with Your Program................................ 74
Integer Library Functions ................................................... 74
Common Input/Output Functions....................................... 75
Functions Implemented as Macros..................................... 75
Functions Implemented as Builtins .................................... 76
Including Header Files ....................................................... 76
Descriptions of C Library Functions ........................................ 77
Generate inline assembly code ........................................... 78
Abort program execution.................................................... 79
Find absolute value............................................................. 80
Arccosine............................................................................ 81
Arcsine................................................................................ 82
Arctangent .......................................................................... 83
Arctangent of y/x................................................................ 84
Convert buffer to double .................................................... 85
Convert buffer to integer .................................................... 86
Convert buffer to long ........................................................ 87
Allocate and clear space on the heap.................................. 88
Round to next higher integer.............................................. 89
Verify the recorded checksum............................................ 90
Verify the recorded checksum............................................ 91
Verify the recorded checksum............................................ 92
Verify the recorded checksum............................................ 93
Cosine ................................................................................. 94
Hyperbolic cosine............................................................... 95
Divide with quotient and remainder................................... 96
Copy a buffer to an eeprom buffer ..................................... 97
Erase the full eeprom space ................................................ 98
Propagate fill character throughout eeprom buffer ............ 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
Free space on the heap...................................................... 106
Extract fraction from exponent part ................................. 107
Get character from input stream ....................................... 108
Get a text line from input stream...................................... 109
Test for alphabetic or numeric character.......................... 110
Test for alphabetic character ............................................ 111
Test for control character.................................................. 112
Test for digit ..................................................................... 113
(iii)
Test for graphic character................................................. 114
Test for lower-case character ........................................... 115
Test for printing character ................................................ 116
Test for punctuation character.......................................... 117
Test for whitespace character ........................................... 118
Test for upper-case character ........................................... 119
Test for hexadecimal digit ................................................ 120
Find long absolute value .................................................. 121
Scale double exponent...................................................... 122
Long divide with quotient and remainder ........................ 123
Natural logarithm ............................................................. 124
Common logarithm .......................................................... 125
Restore calling environment ............................................. 126
Allocate space on the heap............................................... 127
Test for maximum ............................................................ 128
Scan buffer for character .................................................. 129
Compare two buffers for lexical order ............................. 130
Copy one buffer to another............................................... 131
Fuzzify an input................................................................ 132
Copy one buffer to another............................................... 133
Propagate fill character throughout buffer ....................... 134
Test for minimum ............................................................. 135
Extract fraction and integer from double ......................... 136
Raise x to the y power...................................................... 137
Output formatted arguments to stdout.............................. 138
Put a character to output stream....................................... 143
Put a text line to output stream......................................... 144
Generate pseudo-random number .................................... 145
Reallocate space on the heap............................................ 146
Evaluate fuzzy outputs ..................................................... 147
Evaluate fuzzy outputs ..................................................... 148
Allocate new memory ...................................................... 149
Read formatted input........................................................ 150
Save calling environment ................................................. 154
Sin..................................................................................... 156
Hyperbolic sine................................................................. 157
Output arguments formatted to buffer.............................. 158
Real square root................................................................ 159
Seed pseudo-random number generator........................... 160
Read formatted input from a string .................................. 161
Concatenate strings........................................................... 162
Scan string for first occurrence of character .................... 163
(iv)
Compare two strings for lexical order.............................. 164
Copy one string to another ............................................... 165
Find the end of a span of characters in a set..................... 166
Find length of a string....................................................... 167
Concatenate strings of length n ........................................ 168
Compare two n length strings for lexical order................ 169
Copy n length string ......................................................... 170
Find occurrence in string of character in set .................... 171
Scan string for last occurrence of character ..................... 172
Find the end of a span of characters not in set................. 173
Scan string for first occurrence of string .......................... 174
Convert buffer to double .................................................. 175
Convert buffer to long ...................................................... 176
Convert buffer to unsigned long....................................... 177
Tangent ............................................................................. 178
Hyperbolic tangent ........................................................... 179
Convert character to lower-case if necessary................... 180
Convert character to upper-case if necessary ................... 181
Get pointer to next argument in list.................................. 182
Stop accessing values in an argument list ........................ 184
Start accessing values in an argument list ........................ 186
Output arguments formatted to stdout.............................. 188
Output arguments formatted to buffer.............................. 189
Evaluate weighted average ............................................... 190
Chapter 5
Using The Assembler
Invoking ca6812 ..................................................................... 192
Object File............................................................................... 195
Listings.................................................................................... 195
Assembly Language Syntax.................................................... 196
Instructions ....................................................................... 196
Labels ............................................................................... 198
Temporary Labels............................................................. 199
Constants .......................................................................... 200
Expressions....................................................................... 201
Macro Instructions............................................................ 202
Conditional Directives...................................................... 205
Sections............................................................................. 206
Includes............................................................................. 207
Branch Optimization............................................................... 208
Old Syntax .............................................................................. 208
(v)
C Style Directives................................................................... 209
Assembler Directives.............................................................. 209
Align the next instruction on a given boundary............... 210
Define the default base for numerical constants .............. 211
Switch to the predefined .bsct section. ............................. 212
Turn listing of conditionally excluded code on or off...... 213
Allocate constant(s) .......................................................... 214
Allocate constant block .................................................... 215
Turn listing of debug directives on or off......................... 216
Allocate variable(s) .......................................................... 217
Conditional assembly ....................................................... 218
Conditional assembly ....................................................... 219
Stop the assembly............................................................. 220
End conditional assembly................................................. 221
End conditional assembly................................................. 222
End macro definition........................................................ 223
End repeat section ............................................................ 224
Give a permanent value to a symbol ................................ 225
Assemble next byte at the next even address relative to the
start of a section................................................................ 226
Generate error message. ................................................... 227
Conditional assembly ....................................................... 228
Conditional assembly ....................................................... 229
Conditional assembly ....................................................... 230
Conditional assembly ....................................................... 231
Conditional assembly ....................................................... 232
Conditional assembly ....................................................... 233
Conditional assembly ....................................................... 234
Conditional assembly ....................................................... 235
Conditional assembly ....................................................... 236
Conditional assembly ....................................................... 237
Conditional assembly ....................................................... 238
Include text from another text file.................................... 239
Turn on listing during assembly....................................... 240
Create a new local block .................................................. 241
Define a macro ................................................................. 242
Send a message out to STDOUT...................................... 244
Terminate a macro definition ........................................... 245
Turn on or off listing of macro expansion........................ 246
Turn off listing. ................................................................ 247
Disable pagination in the listing file ................................ 248
Creates absolute symbols ................................................. 249
(vi)
Sets the location counter to an offset from the beginning of a
section............................................................................... 250
Start a new page in the listing file.................................... 251
Specify the number of lines per pages in the listing file.. 252
Repeat a list of lines a number of times ........................... 253
Repeat a list of lines a number of times ........................... 254
Restore saved section ....................................................... 256
Terminate a repeat definition............................................ 257
Save section ...................................................................... 258
Define a new section ........................................................ 259
Give a resetable value to a symbol................................... 261
Insert a number of blank lines before the next statement in the
listing file.......................................................................... 262
Place code into a section................................................... 263
Specify the number of spaces for a tab character in the listing
file..................................................................................... 264
Define default header ....................................................... 265
Declare a variable to be visible ........................................ 266
Declare symbol as being defined elsewhere..................... 267
Declare a special external symbol .................................... 268
Declare a special external symbol .................................... 269
Chapter 6
Using The Linker
Introduction............................................................................. 273
Overview................................................................................. 274
Linker Command File Processing........................................... 276
Inserting comments in Linker commands ........................ 277
Linker Options ........................................................................ 278
Global Command Line Options........................................ 279
Segment Control Options ................................................. 280
Segment Grouping............................................................ 283
Linking Files on the Command line................................. 284
Example............................................................................ 284
Include Option .................................................................. 284
Example............................................................................ 285
Private Region Options..................................................... 285
Symbol Definition Option ................................................ 286
Reserve Space Option....................................................... 287
Section Relocation .................................................................. 288
Address Arithmetic........................................................... 288
Overlapping Control......................................................... 289
(vii)
Setting Bias and Offset ........................................................... 289
Setting the Bias................................................................. 289
Setting the Offset.............................................................. 289
Using Default Placement.................................................. 290
Linking Objects ...................................................................... 291
Linking Library Objects ......................................................... 291
Library Order.................................................................... 292
Bank Switching....................................................................... 294
Automatic Data Initialization ................................................. 296
Descriptor Format............................................................. 296
Moveable Code....................................................................... 297
Checksum Computation ......................................................... 298
DEFs and REFs ...................................................................... 300
Special Topics......................................................................... 301
Private Name Regions ...................................................... 301
Renaming Symbols .......................................................... 302
Absolute Symbol Tables .................................................. 305
Description of The Map File .................................................. 306
Return Value........................................................................... 307
Linker Command Line Examples........................................... 307
Chapter 7
Debugging Support
Generating Debugging Information........................................ 310
Generating Line Number Information.............................. 310
Generating Data Object Information ................................ 310
The cprd Utility ...................................................................... 312
Command Line Options ................................................... 312
Examples .......................................................................... 313
The clst utility ......................................................................... 314
Command Line Options ................................................... 314
Chapter 8
Programming Support
The cbank Utility .................................................................... 318
Command Line Options ................................................... 318
Return Status .................................................................... 318
Examples .......................................................................... 319
The chex Utility ...................................................................... 320
Command Line Options ................................................... 320
Return Status .................................................................... 322
Examples .......................................................................... 322
(viii)
The clabs Utility...................................................................... 323
Command Line Options ................................................... 323
Return Status .................................................................... 324
Examples .......................................................................... 324
The clib Utility........................................................................ 326
Command Line Options ................................................... 326
Return Status .................................................................... 327
Examples .......................................................................... 327
The cobj Utility....................................................................... 328
Command Line Options ................................................... 328
Return Status .................................................................... 329
Examples .......................................................................... 329
The cv695 Utility.................................................................... 330
Command Line Options ................................................... 330
Return Status .................................................................... 332
Examples .......................................................................... 332
The cvdwarf Utility................................................................. 333
Command Line Options ................................................... 333
Return Status .................................................................... 334
Examples .......................................................................... 334
Chapter A
Compiler Error Messages
Parser (cp6812) Error Messages............................................. 336
Code Generator (cg6812) Error Messages.............................. 347
Assembler (ca6812) Error Messages ...................................... 348
Linker (clnk) Error Messages ................................................. 351
Chapter B
Modifying Compiler Operation
The Configuration File............................................................ 356
Changing the Default Options ................................................ 357
Creating Your Own Options............................................. 357
Example .................................................................................. 358
Chapter C
MC68HC12 Machine Library
Get a long bitfield............................................................. 360
Store a long bitfield .......................................................... 361
Check stack growth .......................................................... 362
Add double to double ....................................................... 363
Compare double with double............................................ 364
(ix)
Divide double by double .................................................. 365
Multiply double by double ............................................... 366
Negate a double................................................................ 367
Move a structure in DPAGE space................................... 368
Subtract double from double............................................ 369
Copy a double into a double............................................. 370
Convert double to float..................................................... 371
Convert double to integer ................................................. 372
Convert double into long integer...................................... 373
Copy a double onto the stack ........................................... 374
Eeprom char bit field update ............................................ 375
Eeprom short bit field update ........................................... 376
Eeprom long bit field update ............................................ 377
Write a short int aligned in eeprom .................................. 378
Write a char int in eeprom ................................................ 379
Write a double in eeprom ................................................. 380
Write a long int in eeprom................................................ 381
Write a short int in eeprom............................................... 382
Move a structure in eeprom.............................................. 383
Move a structure in eeprom.............................................. 384
Multiply signed int by unsigned int.................................. 385
Multiply unsigned int by signed int.................................. 386
Move a structure in EPAGE space................................... 387
Add float to float .............................................................. 388
Compare floats ................................................................. 389
Divide float by float ......................................................... 390
Float addition.................................................................... 391
Float division.................................................................... 392
Float multiplication .......................................................... 393
Float subtraction............................................................... 394
Multiply float by float ...................................................... 395
Subtract float from float ................................................... 396
Convert float into double .................................................. 397
Convert float to integer..................................................... 398
Convert float into long integer ......................................... 399
Convert integer into double.............................................. 400
Convert integer into float ................................................. 401
Perform C switch statement on long ................................ 402
Perform C switch statement in PIC mode ........................ 403
Perform C switch statement ............................................. 404
Long integer addition ....................................................... 405
Bitwise AND for long integers......................................... 406
(x)
Long integer compare....................................................... 407
Quotient of long integer division...................................... 408
Long addition.................................................................... 409
Long bitwise AND ........................................................... 410
Quotient of long division.................................................. 411
Long shift left ................................................................... 412
Remainder of long division .............................................. 413
Long multiplication .......................................................... 414
Long bitwise OR............................................................... 415
Signed long shift right ...................................................... 416
Quotient of unsigned long division .................................. 417
Remainder of unsigned long division............................... 418
Unsigned long shift right.................................................. 419
Long subtraction ............................................................... 420
Long bitwise exclusive OR .............................................. 421
Long shift left ................................................................... 422
Remainder of long integer division .................................. 423
Multiply long integer by long integer............................... 424
Negate a long integer........................................................ 425
Bitwise OR with long integers ......................................... 426
Signed long shift right ...................................................... 427
Long test against zero....................................................... 428
Long integer subtraction................................................... 429
Convert long integer into double ...................................... 430
Convert long integer into float ......................................... 431
Quotient of unsigned long integer division ...................... 432
Remainder of unsigned long integer division................... 433
Unsigned long shift right.................................................. 434
Bitwise exclusive OR with long integers......................... 435
Compare a long integer to zero ........................................ 436
Far pointer compare.......................................................... 437
Convert unsigned integer into double............................... 438
Convert unsigned integer into float .................................. 439
Convert unsigned long integer into double ...................... 440
Convert unsigned long integer into float.......................... 441
Chapter D
Compiler Passes
The cp6812 Parser .................................................................. 444
Command Line Options ................................................... 444
Return Status .................................................................... 447
Example............................................................................ 447
(xi)
The cg6812 Code Generator................................................... 448
Command Line Options ................................................... 448
Return Status .................................................................... 450
Example............................................................................ 450
The co6812 Assembly Language Optimizer .......................... 451
Command Line Options ................................................... 451
Disabling Optimization .................................................... 452
Return Status .................................................................... 452
Example............................................................................ 452
(xii)
Preface
he Cross Compiler User's Guide for MC68HC12 is a reference
T guide for programmers writing C programs for MC68HC12 micro-
controller environments. It provides an overview of how the cross com-
piler 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 sys-
tem and with your specific target environment.
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.
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
• Listings
• Optimizations
Introduction
The C cross compiler targeting the MC68HC12 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 gen-
erate an object module that contains debugging information that can be
used by COSMIC’s C source level cross debugger or by other debug-
gers or in-circuit emulators.
You begin compilation by invoking the cx6812 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.
For example, if you were instructed to type the compiler command that
generates debugging information, it would appears as:
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 type-
writer font would still be used, but would be enclosed in a line box:
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 infor-
mation for any file, it might appear as:
[ Brackets ]
Items enclosed in brackets are optional. For example, the line:
[ options ]
options
means that one or more options must be specified because options is not
enclosed by brackets.
file1.[o|h12]
means that one file with the extension .o or .h12 may be specified, and
the line:
file1 [ file2 . . . ]
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:
Flags
Flags are used to select options or specify parameters. Options are rec-
ognized 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 previ-
ous one.
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.
Flags Function
-a accept a long integer value
-b accept a long integer value
-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. cx6812
controls the operation of these programs automatically, using the
options you specify, and runs the programs described below in the order
listed:
cg6812 - the code generator. cg6812 accepts the output of cp6812 and
generates assembly language statements.
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:
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 cx6812, the compiler
will generate a file that contains debugging information. You can then
use the COSMIC’s debugger to debug your code.
clib - build and maintain object module libraries. clib allows you to
collect related files into a single named library file for convenient stor-
age. You use it to build and maintain object module libraries in standard
library format.
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 inter-
spersed 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 optimiza-
tions that help make your application smaller and faster:
char,
short,
int, long,
float,
pointer to...,
or array of....
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
0x0. This file must be modified if using a different base address.
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 distri-
bution media. Although this tutorial cannot show all the topics relevant
to the COSMIC tools, it will demonstrate the basics of using the com-
piler for the most common applications.
/* Authorize interrupts.
*/
#define cli()_asm("andcc #$EF\n")
/* Some variables.
*/
char buffer[SIZE]; /* reception buffer */
char *ptlec; /* read pointer */
char *ptecr; /* write pointer */
/* Character reception.
* Loops until a character is received.
*/
char getch(void)
{
char c; /* character to be returned */
/* Main program.
* Sets up the SCI and starts an infinite
* loop of receive transmit.
*/
void main(void)
{
ptecr = ptlec = buffer; /* initialize pointers */
SC1BRL = 55; /* initialize SCI */
SC1CR2 = 0x2c; /* parameters for interrupt */
cli(); /* authorize interrupts */
for (;;) /* loop */
outch(getch()); /* get and put a char */
}
According to the options you will use, the following files, recognized
by the COSMIC naming conventions, will be generated:
cx6812 acia.c
acia.c:
Step 1: Compiling
The first step consists in compiling the C source file and producing an
assembly language file named acia.s.
cx6812 -s acia.c
The -s option directs cx6812 to stop after having produced the assembly
file acia.s. You can then edit this file with your favorite 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
cx6812 -l acia.c
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.
cx6812 -v -s acia.c
acia.c:
cp6812 -o \2.cx1 -i\cx\h6812 -u acia.c
cg6812 -o \2.cx2 \2.cx1
co6812 -o acia.s \2.cx2
Step 2: Assembler
The second step of the compilation is to assemble the code previously
produced. The relocatable object file produced is acia.o.
cx6812 acia.s
or
ca6812 -c -l acia.s
Step 3: Linking
This step consists in linking relocatable files, also referred to as object
modules, produced by the compiler or by the assembler (<files>.o) into
an absolute executable file: acia.h12 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 sev-
eral 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)
.const constant and literal data (e.g. ROM)
.data all static initialized data (e.g. RAM)
.bss all non initialized data (e.g. RAM)
.bsct initialized data in the first 256 bytes (see @dir in
chapter 3), also called zero page
.ubsct non initialized data in the zero page
.fdata any variable in paged area (@far)
In our example, and in the test file provided with the compiler, the
acia.lkf file contains the following information:
You can create your own link command file by modifying the one pro-
vided with the compiler.
lines 1 to 3: These are comment lines. Each line can include comments.
They must be prefixed by the “#” character.
line 9: acia.o, the file that constitutes your application. It follows the
startup routine for code and data
By default and in our example, the .bss segment follows the .data seg-
ment.
The crts.o file contains the runtime startup that performs the following
operations:
After you have modified the linker command file, you can link by typ-
ing:
or
For more information about the converter, see Chapter 8, “The chex
Utility”.
In this example the linker will locate and merge crts.o, acia.o and
module1.o in a text segment at 0xe000, a data segment at 0x2000 and
a bss segment, if needed at 0x2500. 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 0xf000
then the interrupt vectors file, vector.o in a .const segment at 0xffce.
For more information about the linker, see Chapter 6, “Using The
Linker”.
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 val-
ues must reside in RAM.
char var2;
There is one exception to the above rules when you declare data that
will be located in the zero page, using the @dir type qualifier. In this
case, the data is generated into the .bsct section if it is initialized or gen-
erated into the .ubsct section otherwise.
The first method to ensure that these values are correct consists in add-
ing code in your application that reinitializes them from a copy that you
have created and located in ROM, at each restart of the application.
1) that defines a symbol that will force the linker to create a copy of
the initialized RAM in ROM
The following link file demonstrates how to achieve automatic data ini-
tialization.
In case of multiple code and data segments, a link command file could
be:
or
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 initial-
ized data will be located after the second code segment located at
address 0xf000.
cx6812 acia.c
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.
cx6812 -v -l acia.c
When the compiler exits, the following files are left in your current
directory:
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.
cx6812 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.
This command will assemble the start.s file, and compile the two C
source files.
Programming
Environments
This chapter explains how to use the COSMIC program development
system to perform special tasks required by various MC68HC12 appli-
cations.
Introduction
The 68HC12 COSMIC compiler is an ANSI C compiler that offers sev-
eral extensions which support special requirements of embedded sys-
tems programmers. This chapter provides details about:
18 ifdef PIC
19 lbsr _main
20 else
21 jsr _main ; execute main
22 endif
23 _exit:
24 bra _exit ; stay here
25 ;
26 end
Line 17 sets the stack pointer. You may have to modify it to meet the
needs of your application.
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 subdirectory.
zbcl:
std 2,x+ ; clear byte
loop:
cpx #__memory ; end of bss
blo zbcl ; no, continue
ifdef PIC
puld ; clean stack
lbsr _main ; execute main
else
jsr _main ; execute main
endif
_exit:
bra _exit ; 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.
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 opti-
mize references to volatile data.
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 condi-
tions:
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 encoun-
ters an expression that alters the value stored in a const data object.
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 initial-
izer. 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 data object by the function call. 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 indeterminate.
You may specify const and volatile together, in either order. A const
volatile data object could be a Read-only status register, or a variable
whose value may be set by another program.
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 func-
tions 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.
char getchar(void);
char putchar(char c);
The run-time startup codes, crts.s and crtsi.s, contain code which ini-
tializes the bss section space reservations to zero.
The compiler provides a special option, +nobss, which forces the com-
piler to put data initialized to zero or uninitialized data to be explicitly
placed in the .data section.
To place data objects selectively into the zero page section, use the type
qualifier @dir when you declare the data object. For example:
A data object declared this way will be located into the section .bsct, if
it is initialized, or in the section .ubsct otherwise. An external object
name is published via a xref.b declaration at the assembly language
level.
To place data objects into the zero page on a file basis, you use the
#pragma directive of the compiler. The compiler directive:
instructs the compiler to place all data objects of storage class extern or
static into the zero page for the current unit of compilation (usually a
file). The section must end with a #pragma space [].
NOTE
The code generator does not check for zero page overflow.
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.
To place all data objects from a file into eeprom, you can use the
#pragma directive of the compiler. The directive
instructs the compiler to treat all extern and static data in the current file
as eeprom locations. The section must end with a #pragma space [].
NOTE
If you change the location of the default 6812 register map from 0x0 to
some other address, you must also change the address in the eeprom.s
source file, which is in object form in the library libm.h12 or libe.h12 for
the DP256. The source is located in the libm or libe sub-directory.
NOTE
The code generator cannot check if the final address of an @eeprom
object will be valid after linkage.
Redefining Sections
The compiler uses by default predefined sections to output the various
components of a C program. The default sections are:
Section Description
.text executable code
.const text string and constants
.data initialized variables
.bss uninitialized variables
.bsct any variable in zero page (@dir)
.ubsct uninitialized variables in zero page (@dir)
.eeprom any variable in eeprom (@eeprom)
.fdata any variable in paged area (@far)
const
@dir
@eeprom
@far
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 <qualified_name>
sequence.
When the +ceven option is selected in order to have two different sec-
tions for aligned and non aligned constants, renaming the const section
renames both sections by applying the suffix .w to the word aligned
part.
Note that {name} and [name] are equivalent for constant, zero page,
eeprom and far data sections as they are all considered as initialized.
#pragma section ()
Inlining Functions
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
The current implementation does not allow an inlined function to return
anything and such a function has to be defined with the void return type.
char c;
c = PORTA; /* to read from input port */
PORTA = c; /* to write to output port */
Note that COSMIC C does support the pointer and #define methods of
implementing I/O access.
struct acia
{
char status;
char data;
} acia @0x6000;
in each file using the input-output registers. 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 the io.s files which may be included in an assembly source
by a:
All these header files assume a default location for the input-output reg-
isters depending on the actual target. This default value may be changed
by defining the C symbol _BASE by a #define directive before the
header file # include:
The default value of 0 for the register starting address as defined by the
file <ioa4.h> is changed to 0x1000.
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
#pragma asm
xref asmvar
#pragma endasm
void func(void)
{
if (test)
#asm /* no need for { */
sec ; set carry bit
rol asmvar ; access assembler variable
#endasm
else
test = 1;
}
The “string constant” argument is the assembly code you want embed-
ded in your C program. “arguments” follow the standard C rules for
passing arguments.
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().
The string you specify follows standard C rules. For example, carriage
returns can be denoted by the ‘\n’ character.
leas $1000,x
jsr _main
The ‘\n’ character is used to separate the instructions when writing mul-
tiple instructions in the same line.
_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.
allows to test the overflow bit. That way, you can use _asm() to write
equivalents of C functions directly in assembly language.
NOTE
With both methods, the assembler source is added as is to the code dur-
ing the compilation. The optimizer does not modify the specified instruc-
tions, unless the -a option is specified on the code generator. The
assembler input can use lowercase or uppercase mnemonics, and may
include assembler comments.
When you define an @interrupt function, the compiler uses the “rti”
instruction for the return sequence.
NOTE
The @interrupt modifier is an extension to the ANSI standard.
switch .const
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. Then, at link time,
include the following options on the link line:
where vector.o is the file which contains the vector table. This file is
provided in the compiler package. You should modify this vector table
as necessary for your application.
NOTE
The libraries are not built as @far functions and should not be located in
a banked area, if they need to be accessed from any bank .
-bs is automatically set with the value 14 for the 68HC12 proc-
essor. The bank number extracted by the linker and cop-
ied into the window base register, then points to a 16K
bytes block. This option is located on the command line.
given two banks, the first one obtained from func1, func2 and func3
linked at physical address 0x10000, the second obtained from func4,
func5 and func6 linked at physical address 0x14000 . The window
mechanism has to be initialized with the first window at 0x8000. The
code to perform this initialization has to be located in the root segment,
for instance at the beginning of the main function. The linker should
thus be called with the following options:
NOTE
Applications not using bank switching should specified the -bs0 option to
disabled the internal banking verification.
Because code and data spaces are using different chip selects, the result-
ing physical addresses may overlap while they do not in fact address the
same memory space. To allow the linker to verify properly any possible
The linker also verifies that a bank is properly entered with a call
instruction. Any attempt to enter a bank with a jsr instruction will be
reported as an error, unless the jsr is issued from the same bank.
If data banking is used, interrupt functions will have to save and restore
these registers if they are used by the interrupt code. The compiler will
detect automatically any explicit usage done by the interrupt function
itself. If the interrupt function does not use directly those registers but
calls any other function, the compiler will not save the page registers, to
NOTE
No data can be allocated across a page boundary and then far pointers
calculations do not update the page number. This means that this feature
cannot be used to allocate large arrays whose size is larger than the page
size.
Linking banked data sections uses the same directives as code bank
switching. Because code and data pages sizes are not identical, an extra
option is needed to specify the page size when defining a segment.
DPAGE segments will use a -ds12 option while EPAGE segments will
use a -ds10 option. To link a DPAGE banked segment, you can use the
automatic filling option such as:
The physical address will match the RAM chip address decoded by the
CSD chip select. The maximum size specified here allows up to 4
pages.
NOTE
Bank switching cannot be used with PIC code.
The data sections are still using the standard addressing modes and then
are linked to a fixed address.
The startup modules crts.s and crtsi.s and the libraries are prepared to
support PIC code, but are packaged in their standard shape. To use the
PIC feature, you need to recompile the startups and the libraries with
the +pic option set.
Note that for keeping efficiency, most of these functions are directly
inlined in the code output instead of calling actual functions.
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 word aligned constants to be produced into the
.const.w section. Another option on the code generator allows constants
to be produced directly in the .text section.
The compiler generates initialized data into the .data section. 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 nor-
mally generated into the .const section. Initialized data declared with
the @dir space modifier will be generated into the .bsct section. Unini-
tialized data are normally generated into the .bss section or the .ubsct
section for @dir variables, unless forced to the .data section by the
compiler option +nobss. Far data are generated into the .fdata section
unless the compiler option +nofds has been specified. In such a case,
far data are allocated like plain data.
1) Arguments are moved onto the stack from right to left. Unless the
function returns a double or a structure, the first argument is stored
in the d register if its size is less than or equal to the size of an int,
or in d,x register pair if its type is long or unwidened float.
NOTE
By default, character data is sign extended to short, and floats are
extended to doubles. This widening can be disabled at the user's option.
In that case, character and float will be left unmodified. If widening is
disabled, and the first argument to a function is of type char, and it is
stored in a register, then it will be stored in register b. Data of type short,
integer and long integer are left unmodified.
Register Usage
Except for the return value, the registers d, x, y and the condition codes
are undefined on return from a function call. The return value is in d if
it is of type char widened to short, short, integer or pointer to.... The
return value is in the register d and x if it is of type long or float. The d
register holds the low order word.
Stack Model
Because the stack pointer can be used to address directly the stack, no
register is dedicated as frame pointer. If automatics are needed, the
sequence:
leas -<#>,s
pshd
leas -<#>,s
The stack pointer is set to the beginning of the area reserved for auto-
matic data. This is done because of addressing mode characteristics of
the MC68HC12. The assembler symbol OFST is set to the size of the
space needed for automatics; arguments are at OFST+4,s, OFST+6,s,
and so forth. Auto storage is on the stack at OFST-1,s and down. If no
automatics and no arguments are used, the stack frame is not built. To
return, the sequence:
leas <#>,s
rts
will restore the previous context. Functions that do not have any argu-
ments or autos, and do not use any temporary storage (required to per-
form operations on structure data or cast float data, for example) do not
reference the frame pointer x and do not stack it.
Stack Representation
The diagrams below show the stack layout at function entry func. In this
example, func has three arguments: arg1, arg2 and arg3. The first dia-
gram describes cases where arg1 is in the d register. The second dia-
gram describes cases where arg1 is not in the d register. In both cases,
arguments are assumed to be widened, so char is widened to short and
float to double.
arg1 is in d
locals arg1 @return arg2 arg3
OFST+0 OFST+4
arg1 not in d
locals @return arg1 arg2 arg3
OFST+2
this is because the heap would overlap the stack). Therefore it is possi-
ble to change the heap default location by rewriting the _sbreak func-
tion.
The yellow array is used to calculate the stack pointer value to check the
heap limits. This array is declared as the last local variable, so its
address is almost equal to the stack pointer once the function has been
entered. It is declared to be 40 bytes wide to allow for some security
margin. If the new top is outside the authorized limits, the function
returns a NULL pointer, otherwise, it returns the start of the new allo-
cated area. Note that the top variable _brk is a static variable initialized
to zero (NULL pointer). It is set to the heap start on the first call. It is
also possible to initialize it directly within the declaration, but in this
case, we create an initialized variable in the data segment which needs
to be initialized by the startup. The current code avoids such a require-
ment by initializing the variable to zero (in the bss segment), which is
simply done by the standard startup sequence.
The heap area is declared as an array of char simply named heap. The
algorithm is mainly the same, and once the new top is computed, it is
compared with the array limits. Note that the array is declared as a static
local variable. It is possible to have it declared as a static global varia-
ble. If you want it to be global, be careful on the selected name. You
should start it with a ‘_’ character to avoid any conflict with the applica-
tion variables.
If you need to place the heap array at a specific location, you need to
locate this module at a specific address using the linker options. In the
above example, the heap array will be located in the .bss segment, thus,
complicating the startup code which would need to zero two bss sec-
tions instead of one. Compiling this function, with the +nobss option,
will force allocation of the heap, in the data segment and you can locate
it easily with linker directives as:
It is also possible to handle the heap area outside of any C object, just
by defining the heap start and end values using the linker +def direc-
tives. Assuming these symbols are named _heap_start and _heap_end
in C, it is possible to define them at link time with such directives:
NOTE
Since the initial content of the area may be undefined, the -ib option
should be specified to exclude the segment in the automatic RAM initiali-
zation.
You need to add an extra ‘_’ character when defining a C symbol at link
time to match the C compiler naming conventions.
Data Representation
Data objects of type char are stored as one byte:
7 0
Char representation
Data objects of type short int, int and 16 bit pointers (@near) are stored
as two bytes, more significant byte first:
15 8 7 0
Data objects of type long integer are stored as four bytes, in descending
order of significance:
31 24 23 16 15 8 7 0
Data objects of type @far pointer are stored as four bytes. The first
word is the logical address represented as 16 bit pointer, the next byte is
the paged value and the next byte is a 0.
15 8 7 0 7 0 7 0
Data objects of type float and double are represented as for the pro-
posed IEEE Floating Point Standard; four bytes (for float) or eight bytes
(for double) stored in descending order of significance. The IEEE rep-
resentation is: most significant bit is one for negative numbers, and zero
otherwise; the next eight bits (for float) or eleven bits (for double) are
the characteristic, biased such that the binary exponent of the number is
the characteristic minus 126 (for float) or 1022 (for double); the remain-
ing bits are the fraction, starting with the weighted bit. If the character-
istic is zero, the entire number is 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 0
63 62 52 51 0
• Generating Listings
• C Library Support
cx6812 is the name of the compiler. The option list is optional. You
must include the name of at least one input file <file>. <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 com-
bination of these suffixes in any order.
If you do not specify any command line options, cx6812 will compile
your <files> with the default options. It will also write the name of each
file as it is processed. It writes any error messages to STDERR.
cx6812 acia.c
The example command above does not specify any compiler options. In
this case, the compiler will use only default options to compile and
assemble your program. You can change the operation of the compiler
by specifying the options you want when you run the compiler.
-ce* specify a path for the error files. By default, errors are cre-
ated in the same directoy than the source files.
-cl* specify a path for the listing files. By default, listings are
created in the same directoy than the source files.
-co* specify a path for the object files. By default, objects are
created in the same directoy than the source files.
+ceven split the constants into two sections, one for single byte
constant (.const) and one for the other ones which are sup-
posed to be accessed more efficiently when properly
aligned (.const.w).
+even align any object larger than one byte on an even boundary.
+nobss do not use the .bss section for variables allocated in exter-
nal 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 contants in the code section .text instead
of the specific section .const. This option should be used
when using bank switching to garantee that const object
are is the same bank than the code accessing them.
+zpage force all data to be defined into the .bsct section. This
option assumes that the full application declares less than
the available space in the .bsct section. The linker should
be configured to check the size. For more information, see
“Placing Data Objects in The Zero Page Section” in Chap-
ter 3.
Generating Listings
You can generate listings of the output of any (or all) the compiler
passes by specifying the -l option to cx6812. 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 pro-
duced by compiling the C source file acia.c with the -l option:
cx6812 -l acia.c
cx6812 -e prog.c
The error file name is obtained from the source filename by replacing
the .c suffix by the .err suffix.
Return Status
cx6812 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:
cx6812 -v file.c
To save the intermediate files created by the code generator and halt
before the assembler:
cx6812 -s file.c
C Library Support
This section describes the facilities provided by the C library. The C
cross compiler for MC68HC12 includes all useful functions for pro-
grammers writing applications for ROM-based systems.
#include <header_name>
The names of the header files packaged with the C library and the func-
tions declared in each header are listed below.
<float.h> - Header file for limit constants for floating point values.
<stdlib.h> - Header file for general utilities: abs, abort, atof, atoi, atol,
calloc, div, exit, free, labs, ldiv, malloc, rand, realloc, srand, strtod, str-
tol and strtoul.
Functions returning int - C library functions that return int and can
therefore be called without any header file, since int is the function
return type that the compiler assumed by default, are: isalnum, isalpha,
iscntrl, isgraph, isprint, ispunct, isspace, isxdigit, isdigit, isupper,
islower, sbreak, tolower and toupper.
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.
_asm
Description
Generate inline assembly code
Syntax
/* no header file need be included */
_asm(<string constant>, ...)
Function
_asm generates inline assembly code by copying <string constant>
and quoting it into the output assembly code stream. If extra arguments
are specified, they are processed as for a standard function. If argu-
ments are stacked, they are popped off just after the inline code pro-
duced. For more information, see “Inserting Inline Assembly
Instructions” in Chapter 3.
Return Value
Nothing, unless _asm() is used in an expression. In that case, normal
return conventions must be followed. For more information, see “Regis-
ter Usage” in Chapter 3.
Example
The sequence tsx; pshx, may be generated by the following call:
_asm(“\ttsx\n\tpshx\n”);
Notes
_asm() is not packaged in any library. It is recognized (and its argument
passed unchanged) by the compiler itself.
abort
Description
Abort program execution
Syntax
#include <stdlib.h>
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.
abs
Description
Find absolute value
Syntax
#include <stdlib.h>
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:
See Also
labs, fabs
Notes
abs is packaged in the integer library.
acos
Description
Arccosine
Syntax
#include <math.h>
double acos(double x)
Function
acos computes the angle in radians the cosine of which is x, to full dou-
ble 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.
asin
Description
Arcsine
Syntax
#include <math.h>
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.
atan
Description
Arctangent
Syntax
#include <math.h>
double atan(double x)
Function
atan computes the angle in radians; the tangent of which is x, atan com-
putes the angle in radians; the tangent of which is x, to full double preci-
sion.
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:
See Also
acos, asin, atan2
Notes
atan is packaged in the floating point library.
atan2
Description
Arctangent of y/x
Syntax
#include <math.h>
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:
See Also
acos, asin, atan
Notes
atan2 is packaged in the floating point library.
atof
Description
Convert buffer to double
Syntax
#include <stdlib.h>
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 permit-
ted; 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 recogniza-
ble 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.
atoi
Description
Convert buffer to integer
Syntax
#include <stdlib.h>
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 unrecog-
nizable character. Acceptable characters are the decimal digits. If the
stop character is l or L, it is skipped over.
Return Value
atoi returns the converted integer value. If the string has no recogniza-
ble 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.
atol
Description
Convert buffer to long
Syntax
#include <stdlib.h>
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.
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.
calloc
Description
Allocate and clear space on the heap
Syntax
#include <stdlib.h>
void *calloc(int nelem, int elsize)
Function
calloc allocates space on the heap for an item of size nbytes, where
nbytes = nelem * elsize. The space allocated is guaranteed to be at least
nbytes long, starting from the pointer returned, which is guaranteed to
be on a proper storage boundary for an object of any type. The heap is
grown as necessary. If space is exhausted, calloc returns a null pointer.
The pointer returned may be assigned to an object of any type without
casting. The allocated space is initialized to zero.
Return Value
calloc returns a pointer to the start of the allocated cell if successful;
otherwise it returns NULL.
Example
To allocate an array of ten doubles:
double *pd;
pd = calloc(10, sizeof (double));
See Also
free, malloc, realloc
Notes
calloc is packaged in the integer library.
ceil
Description
Round to next higher integer
Syntax
#include <math.h>
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 ceil(x)
5.1 6.0
5.0 5.0
0.0 0.0
-5.0 -5.0
-5.1 -5.0
See Also
floor
Notes
ceil is packaged in the floating point library.
_checksum
Description
Verify the recorded checksum
Syntax
int _checksum()
Function
_checksum 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 information, 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.
See Also
_checksumx, _checksum16, _checksum16x
_checksum
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 information, 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.
See Also
_checksum, _checksum16, _checksum16x
_checksum
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 information, 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.
See Also
_checksum, _checksumx, _checksum16x
_checksum
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 information, 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.
See Also
_checksum, _checksumx, _checksum16
cos
Description
Cosine
Syntax
#include <math.h>
double cos(double x)
Function
cos computes the cosine of x, expressed in radians, to full double preci-
sion. 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:
See Also
sin, tan
Notes
cos is packaged in the floating point library.
cosh
Description
Hyperbolic cosine
Syntax
#include <math.h>
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 repre-
sented, cosh returns zero.
Example
To use the Moivre's theorem to compute (cosh x + sinh x) to the nth
power:
See Also
exp, sinh, tanh
Notes
cosh is packaged in the floating point library.
div
Description
Divide with quotient and remainder
Syntax
#include <stdlib.h>
div_t div(int numer, int denom)
Function
div divides the integer numer by the integer denom and returns the quo-
tient and the remainder in a structure of type div_t. The field quot con-
tains 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;
See Also
ldiv
Notes
div is packaged in the integer library.
eepcpy
Description
Copy a buffer to an eeprom buffer
Syntax
#include <string.h>
void *eepcpy(void *s1, void *s2, unsigned int n)
Function
eepcpy copies the first n characters starting at location s2 into the eep-
rom buffer beginning at s1.
Return Value
eepcpy returns s1.
Example
To place “first string, second string” in eepbuf[]:
See Also
eepset, eepera
Notes
eepcpy is packaged in the integer library.
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
eepset, eepcpy
Notes
eepera is packaged in the machine library.
eepset
Description
Propagate fill character throughout eeprom buffer
Syntax
#include <string.h>
void *eepset(void *s, int c, unsigned int n)
Function
eepset floods the n character buffer starting at eeprom location s with
fill character c. The function waits for all bytes to be programmed.
Return Value
eepset returns s.
Example
To flood a 512 byte eeprom buffer with NULs:
See Also
eepcpy, eepera
Notes
eepset is packaged in the integer library.
exit
Description
Exit program execution
Syntax
#include <stdlib.h>
void exit(int status)
Function
exit stops the execution of a program by switching to the startup mod-
ule 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.
exp
Description
Exponential
Syntax
#include <math.h>
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 repre-
sented, exp returns zero.
Example
To compute the hyperbolic sine of x:
See Also
log
Notes
exp is packaged in the floating point library.
fabs
Description
Find double absolute value
Syntax
#include <math.h>
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 5.0
0.0 0.0
-3.7 3.7
See Also
abs, labs
Notes
fabs is packaged in the floating point library.
_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 loca-
tion 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 informa-
tion, see “Moveable Code” in Chapter 6.
Return Value
_fctcpy returns a non zero value if a segment has been found and cop-
ied. It returns 0 otherwise.
Example
if (_fctcpy(‘b’))
flash();
Notes
_fctcpy is packaged in the integer library.
floor
Description
Round to next lower integer
Syntax
#include <math.h>
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 floor(x)
5.1 5.0
5.0 5.0
0.0 0.0
-5.0 -5.0
-5.1 -6.0
See Also
ceil
Notes
floor is packaged in the floating point library.
fmod
Description
Find double modulus
Syntax
#include <math.h>
double fmod(double x, double y)
Function
fmod computes the floating point remainder of x / y, to full double pre-
cision. 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 y fmod(x, y)
Notes
fmod is packaged in the floating point library.
free
Description
Free space on the heap
Syntax
#include <stdlib.h>
void free(void *ptr)
Function
free returns an allocated cell to the heap for subsequence reuse. The cell
pointer ptr must have been obtained by an earlier calloc, malloc, or
realloc call; otherwise the heap will become corrupted. free does its
best to check for invalid values of ptr. A NULL value for ptr is explic-
itly allowed, however, and is ignored.
Return Value
Nothing.
Example
To give back an allocated area:
free(pd);
See Also
calloc, malloc, realloc
Notes
No effort is made to lower the system break when storage is freed, so it
is quite possible that earlier activity on the heap may cause problems
later on the stack.
frexp
Description
Extract fraction from exponent part
Syntax
#include <math.h>
double frexp(double val, int *exp)
Function
frexp partitions the double at val, which should be non-zero, into a frac-
tion 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.
getchar
Description
Get character from input stream
Syntax
#include <stdio.h>
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:
See Also
putchar
Notes
getchar is packaged in the integer library.
gets
Description
Get a text line from input stream
Syntax
#include <stdio.h>
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.
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.
isalnum
Description
Test for alphabetic or numeric character
Syntax
#include <ctype.h>
int isalnum(int 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.
isalpha
Description
Test for alphabetic character
Syntax
#include <ctype.h>
int isalpha(int 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. Oth-
erwise the value returned is zero.
Example
To find the end points of an alphabetic string:
See Also
isalnum, isdigit, islower, isupper, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
iscntrl
Description
Test for control character
Syntax
#include <ctype.h>
int iscntrl(int c)
Function
iscntrl tests whether c is a delete character (0177 in ASCII), or an ordi-
nary 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:
See Also
isgraph, isprint, ispunct, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isdigit
Description
Test for digit
Syntax
#include <ctype.h>
int isdigit(int 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:
See Also
isalnum, isalpha, islower, isupper, isxdigit, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isgraph
Description
Test for graphic character
Syntax
#include <ctype.h>
int isgraph(int c)
Function
isgraph tests whether c is a graphic character; i.e. any printing charac-
ter 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:
See Also
iscntrl, isprint, ispunct, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
islower
Description
Test for lower-case character
Syntax
#include <ctype.h>
int islower(int c)
Function
islower tests whether c is a lower-case alphabetic character.
Return Value
islower returns nonzero if c is a lower-case character; otherwise the
value returned is zero.
Example
To convert to upper-case:
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.
isprint
Description
Test for printing character
Syntax
#include <ctype.h>
int isprint(int 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:
See Also
iscntrl, isgraph, ispunct, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
ispunct
Description
Test for punctuation character
Syntax
#include <ctype.h>
int ispunct(int c)
Function
ispunct tests whether c is a punctuation character. Punctuation charac-
ters 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:
See Also
iscntrl, isgraph, isprint, isspace
Notes
If the argument is outside the range [-1, 255], the result is undefined.
isspace
Description
Test for whitespace character
Syntax
#include <ctype.h>
int isspace(int 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.
isupper
Description
Test for upper-case character
Syntax
/* no header file need be included */
int isupper(int c)
Function
isupper tests whether c is an upper-case alphabetic character.
Return Value
isupper returns nonzero if c is an upper-case character; otherwise the
value returned is zero.
Example
To convert to lower-case:
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.
isxdigit
Description
Test for hexadecimal digit
Syntax
#include <ctype.h>
int isxdigit(int 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:
See Also
isalnum, isalpha, isdigit, islower, isupper, tolower, toupper
Notes
If the argument is outside the range [-1, 255], the result is undefined.
labs
Description
Find long absolute value
Syntax
#include <stdlib.h>
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:
See Also
abs, fabs
Notes
labs is packaged in the integer library.
ldexp
Description
Scale double exponent
Syntax
#include <math.h>
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 exp ldexp(x, exp)
1.0 1 2.0
1.0 0 1.0
1.0 -1 0.5
0.0 0 0.0
See Also
frexp, modf
Notes
ldexp is packaged in the floating point library.
ldiv
Description
Long divide with quotient and remainder
Syntax
#include <stdlib.h>
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 remain-
der.
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.quot;
sec = result.rem;
See Also
div
Notes
ldiv is packaged in the integer library.
log
Description
Natural logarithm
Syntax
#include <math.h>
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:
See Also
exp
Notes
log is packaged in the floating point library.
log10
Description
Common logarithm
Syntax
#include <math.h>
double log10(double x)
Function
log10 computes the common log of x to full double precision by com-
puting 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 argu-
ment 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.
longjmp
Description
Restore calling environment
Syntax
#include <setjmp.h>
void longjmp(jmp_buf env, int val)
Function
longjmp restores the environment saved in env by setjmp. If env has not
been set by a call to setjmp, or if the caller has returned in the mean-
time, the resulting behavior is unpredictable.
Return Value
When longjmp returns, program execution continues as if the corre-
sponding call to setjmp had returned the value val. longjmp cannot force
setjmp to return the value zero. If val is zero, setjmp returns the value
one.
Example
You can write a generic error handler as:
See Also
setjmp
Notes
longjmp is packaged in the integer library.
malloc
Description
Allocate space on the heap
Syntax
#include <stdlib.h>
void *malloc(unsigned int nbytes)
Function
malloc allocates space on the heap for an item of size nbytes. The space
allocated is guaranteed to be at least nbytes long, starting from the
pointer returned, which is guaranteed to be on a proper storage bound-
ary for an object of any type. The heap is grown as necessary. If space is
exhausted, malloc returns a null pointer.
Return Value
malloc returns a pointer to the start of the allocated cell if successful;
otherwise it returns NULL. The pointer returned may be assigned to an
object of any type without casting.
Example
To allocate an array of ten doubles:
double *pd;
pd = malloc(10 * sizeof *pd);
See Also
calloc, free, realloc
Notes
malloc is packaged in the integer library.
max
Description
Test for maximum
Syntax
#include <stdlib.h>
max(a,b)
Function
max obtains the maximum of its two arguments, a and b. Since max is
implemented as a builtin function, 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 paren-
thesized.
Example
To set a new maximum level:
See Also
min
Notes
max is an extension to the proposed ANSI C standard.
max is a builtin declared in the <stdlib.h> header file. You can use it by
including <stdlib.h> with your program. Because it is a builtin, max
cannot be called from non-C programs, nor can its address be taken.
memchr
Description
Scan buffer for character
Syntax
#include <string.h>
void *memchr(void *s, int c, unsigned int 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:
See Also
strchr, strcspn, strpbrk, strrchr, strspn
Notes
memchr is packaged in the integer library.
memcmp
Description
Compare two buffers for lexical order
Syntax
#include <string.h>
int memcmp(void *s1, void *s2, unsigned int 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.
memcpy
Description
Copy one buffer to another
Syntax
#include <string.h>
void *memcpy(void *s1, void *s2, unsigned int 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[]:
See Also
strcpy, strncpy
Notes
memcpy is implemented as a builtin function.
memhc12
Description
Fuzzify an input
Syntax
#include <fuzzy.h>
void memhc12(char crisp, char *t_shape,
char *t_result, int nba)
Function
memchc12 evaluates the grade of membership of all the adjectives
associated to an input. Each adjective is described by a shape and an
output byte. The input value is specified by the crisp argument, and is
followed by a pointer t_shape to an array of shapes (four bytes each),
and a pointer t_result to an array of output addresses. The last argu-
ment nba specifies the number of output to evaluate.
Return Value
memhc12 sets the content of the array of nba bytes specified by t_shape
to the grade of membership of the input crisp according to an array of
shapes specified by t_result.
Example
memhc12(val, tabsh, tabptr, 4);
See Also
revhc12, revwhc12, wavhc12
memmove
Description
Copy one buffer to another
Syntax
#include <string.h>
void *memmove(void *s1, void *s2, unsigned int 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:
See Also
memcpy
Notes
memmove is packaged in the integer library.
memset
Description
Propagate fill character throughout buffer
Syntax
#include <string.h>
void *memset(void *s, int c, unsigned int 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.
min
Description
Test for minimum
Syntax
#include <stdlib.h>
min(a,b)
Function
min obtains the minimum of its two arguments, a and b. Since min is
implemented as a builtin function, 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 paren-
thesized.
Example
To set a new minimum level:
See Also
max
Notes
min is an extension to the ANSI C standard.
min is a builtin declared in the <stdlib.h> header file. You can use it by
including <stdlib.h> with your program. Because it is a builtin, min
cannot be called from non-C programs, nor can its address be taken.
modf
Description
Extract fraction and integer from double
Syntax
#include <math.h>
double modf(double val, double *pd)
Function
modf partitions the double val into an integer portion, which is deliv-
ered 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 *pd modf(val, *pd)
5.1 5 0.1
5.0 5 0.0
4.9 4 0.9
0.0 0 0.0
-1.4 -1 -0.4
See Also
frexp, ldexp
Notes
modf is packaged in the floating point library.
pow
Description
Raise x to the y power
Syntax
#include <math.h>
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 dou-
ble 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 y pow(x, y)
See Also
exp
Notes
pow is packaged in the floating point library.
printf
Description
Output formatted arguments to stdout
Syntax
#include <stdio.h>
int printf(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.
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 for-
mat string is encountered.
If the character after ‘%’ is not a valid conversion character, the behav-
ior is undefined.
Return Value
printf returns the number of characters transmitted, or a negative
number if a write error occurs.
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);
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 ver-
sion cannot print or manipulate floating point numbers. If your pro-
grams 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.
putchar
Description
Put a character to output stream
Syntax
#include <stdio.h>
int putchar(c)
Function
putchar copies c to the user specified output stream.
Return Value
putchar returns c. If a write error occurs, putchar returns EOF.
Example
To copy input to output:
See Also
getchar
Notes
putchar is packaged in the integer library.
puts
Description
Put a text line to output stream
Syntax
#include <stdio.h>
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.
rand
Description
Generate pseudo-random number
Syntax
#include <stdlib.h>
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.
realloc
Description
Reallocate space on the heap
Syntax
#include <stdlib.h>
void *realloc(void *ptr, unsigned int nbytes)
Function
realloc grows or shrinks the size of the cell pointed to by ptr to the size
specified by nbytes. The contents of the cell will be unchanged up to the
lesser of the new and old sizes. The cell pointer ptr must have been
obtained by an earlier calloc, malloc, or realloc call; otherwise the heap
will become corrupted.
Return Value
realloc returns a pointer to the start of the possibly moved cell if suc-
cessful. Otherwise realloc returns NULL and the cell and ptr are
unchanged. The pointer returned may be assigned to an object of any
type without casting.
Example
To adjust p to be n doubles in size:
p = realloc(p, n * sizeof(double));
See Also
calloc, free, malloc
Notes
realloc is packaged in the integer library.
revhc12
Description
Evaluate fuzzy outputs
Syntax
#include <fuzzy.h>
void revhc12(char *rules, char *in_out)
Function
revhc12 evaluates fuzzy outputs based on evaluation rules which are
specified by the pointer rules. The base address of input and output
bytes is specified by the pointer in_out. Refer to the “68HC12 Refer-
ence Manual”, for a complete description of the rules encoding.
Return Value
revhc12 sets the output bytes to the result values according to the evalu-
ation rules.
Example
revhc12(rules, base);
See Also
memhc12, revwhc12, wavhc12
Notes
revhc12 is a builtin function declared in the <fuzzy.h> header file.
revwhc12
Description
Evaluate fuzzy outputs
Syntax
#include <fuzzy.h>
void revwhc12(unsigned int *rules, char *weight)
Function
revwhc12 evaluates fuzzy outputs based on evaluation rules which are
specified by the pointer rules. If the weight pointer is provided, it
should point to an array of byte weights used to ponderate the evalua-
tion. Otherwise weight has to be specified has the NULL pointer. Refer
to the “68HC12 Reference Manual”, for a complete description of the
rules encoding.
Return Value
revwhc12 sets the output bytes to the result values according to the
evaluation rules.
Example
revwhc12(rules, NULL);
See Also
memhc12, revhc12, wavhc12
Notes
revwhc12 is a builtin function declared in the <fuzzy.h> header file.
sbreak
Description
Allocate new memory
Syntax
/* no header file need be included */
void *sbreak(unsigned int size)
Function
sbreak modifies the program memory allocation as necessary, to make
available at least size contiguous bytes of new memory, on a storage
boundary adequate for representing any type of data. There is no guar-
antee that successive calls to sbreak will deliver contiguous areas of
memory.
Return Value
sbreak returns a pointer to the start of the new memory if successful;
otherwise the value returned is NULL.
Example
To buy space for an array of symbols:
Notes
sbreak is packaged in the integer library.
scanf
Description
Read formatted input
Syntax
#include <stdio.h>
int scanf(char *fmt,...)
Function
scanf reads formatted input from the output stream using the format
string at fmt and the arguments specified by ..., as described below.
Format Specifiers
The format string may contain:
• ordinary characters other than ‘%’ which must match the next
character of the input stream.
If the character after ‘%’ is not a valid conversion character, the behav-
ior is undefined.
newline) is left unread unless matched in the control string. The success
of literal matches and suppressed assignments is not directly determina-
ble other than via the %n conversion.
Return Value
scanf returns the number of assigned input items, which can be zero if
there is an early conflict between an input character and the format, or
EOF if end of file is encountered before the first conflict or conversion.
Example
To be certain of a dubious request:
See Also
sscanf
Notes
scanf is packaged in both the integer library and the floating point
library. The functionality of the integer only version of scanf is a subset
of the functionality of the floating point version. The integer only ver-
sion cannot read or manipulate floating point numbers. If your pro-
grams call the integer only version of scanf, the following conversion
specifiers are invalid: e, f, g and p. The L flag is also invalid.
setjmp
Description
Save calling environment
Syntax
#include <setjmp.h>
int setjmp(jmp_buf env)
Function
setjmp saves the calling environment in env for later use by the
longjmp function.
Return Value
setjmp returns zero on its initial call, or the argument to a longjmp call
that uses the same env.
Example
To call any event until it returns 0 or 1 and calls longjmp, which will
then start execution at the function event0 or event1:
switch (setjmp(ev[0]))
{
case 0: /* registered */
break;
default: /* event 0 occurred */
event0();
next();
}
switch (setjmp(ev[1])
{
case 0: /* registered */
break;
default: /* event 1 occurred */
event1();
next();
}
next();
...
next()
{
int i;
for (; ;)
{
i = anyevent();
if (i == 0 || i == 1)
longjmp(ev[i]);
}
}
See Also
longjmp
Notes
setjmp is packaged in the integer library.
sin
Description
Sin
Syntax
#include <math.h>
double sin(double x)
Function
sin computes the sine of x, expressed in radians, to full double preci-
sion. 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:
See Also
cos, tan
Notes
sin is packaged in the floating point library.
sinh
Description
Hyperbolic sine
Syntax
#include <math.h>
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 repre-
sented, sinh returns zero.
Example
To obtain the hyperbolic sine of complex z:
typedef struct
{
double x, iy;
}complex;
complex z;
See Also
cosh, exp, tanh
Notes
sinh is packaged in the floating point library.
sprintf
Description
Output arguments formatted to buffer
Syntax
#include <stdio.h>
int sprintf(char *s, 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 ter-
minating NUL character.
Example
To format a double at d into buf:
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 sub-
set of the functionality of the floating point version. The integer only
version cannot print or manipulate floating point numbers. If your pro-
grams 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.
sqrt
Description
Real square root
Syntax
#include <math.h>
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:
Notes
sqrt is packaged in the floating point library.
srand
Description
Seed pseudo-random number generator
Syntax
#include <stdlib.h>
void srand(unsigned char nseed)
Function
srand uses nseed as a seed for a new sequence of pseudo-random num-
bers 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 0.
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.
sscanf
Description
Read formatted input from a string
Syntax
#include <stdio.h>
int sscanf(schar *, char *fmt,...)
Function
sscanf reads formatted input from the NUL-terminated string pointed at
by s using the format string at fmt and the arguments specified by ..., in
exactly the same way as scanf. See the description of the scanf function
for information on the format conversion specifiers.
Return Value
sscanf returns the number of assigned input items, which can be zero if
there is an early conflict between an input character and the format, or
EOF if the end of the string is encountered before the first conflict or
conversion.
See Also
scanf
Notes
sscanf is packaged in both the integer library and the floating point
library. The functionality of the integer only version of sscanf is a sub-
set of the functionality of the floating point version. The integer only
version cannot print or manipulate floating point numbers. If your pro-
grams call the integer only version of sscanf, the following conversion
specifiers are invalid: e, f, g and p. The L flag is also invalid.
strcat
Description
Concatenate strings
Syntax
#include <string.h>
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.
strchr
Description
Scan string for first occurrence of character
Syntax
#include <string.h>
char *strchr(char *s, int 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.
strcmp
Description
Compare two strings for lexical order
Syntax
#include <string.h>
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.
strcpy
Description
Copy one string to another
Syntax
#include <string.h>
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.
strcspn
Description
Find the end of a span of characters in a set
Syntax
#include <string.h>
unsigned int strcspn(char *s1, char *s2)
Function
strcspn scans the string starting at s1 for the first occurrence of a char-
acter in the string starting at s2. It computes a subscript i such that:
Return Value
strcspn returns the lowest possible value of i. s1[i] designates the termi-
nating 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:
See Also
memchr, strchr, strpbrk, strrchr, strspn
Notes
strcspn is packaged in the integer library.
strlen
Description
Find length of a string
Syntax
#include <string.h>
unsigned int strlen(char *s)
Function
strlen scans the text string starting at s to determine the number of char-
acters 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.
strncat
Description
Concatenate strings of length n
Syntax
#include <string.h>
char *strncat(char *s1, char *s2, unsigned int 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 ter-
minating 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.
strncmp
Description
Compare two n length strings for lexical order
Syntax
#include <string.h>
int strncmp(char *s1, char *s2, unsigned int 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 com-
pared, 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.
strncpy
Description
Copy n length string
Syntax
#include <string.h>
char *strncpy(char *s1, char *s2, unsigned int 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:
See Also
memcpy, strcpy
Notes
If the string s2 points at is longer than n characters, the result may not
be NUL-terminated.
strpbrk
Description
Find occurrence in string of character in set
Syntax
#include <string.h>
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):
See Also
memchr, strchr, strcspn, strrchr, strspn
Notes
strpbrk is packaged in the integer library.
strrchr
Description
Scan string for last occurrence of character
Syntax
#include <string.h>
char *strrchr(char *s,int 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.
strspn
Description
Find the end of a span of characters not in set
Syntax
#include <string.h>
unsigned int strspn(char *s1, char *s2)
Function
strspn scans the string starting at s1 for the first occurrence of a charac-
ter not in the string starting at s2. It computes a subscript i such that
Return Value
strspn returns the lowest possible value of i. s1[i] designates the termi-
nating 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.
strstr
Description
Scan string for first occurrence of string
Syntax
#include <string.h>
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.
strtod
Description
Convert buffer to double
Syntax
#include <stdlib.h>
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 over-
flow, underflow, or invalid character strings.
Return Value
strtod returns the converted double value. If the string has no recogniz-
able 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.
strtol
Description
Convert buffer to long
Syntax
#include <stdlib.h>
long strtol(char *nptr, char **endptr, int 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, other-
wise 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.
Return Value
strtol returns the converted long integer. If the string has no recogniza-
ble 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.
strtoul
Description
Convert buffer to unsigned long
Syntax
#include <stdlib.h>
unsigned long strtoul(char *nptr, char **endptr,
int 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, charac-
ters a-z or A-Z represents digits in range 10-36. If base is zero, a lead-
ing “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.
Return Value
strtoul returns the converted long integer. If the string has no recogniza-
ble 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.
tan
Description
Tangent
Syntax
#include <math.h>
double tan(double x)
Function
tan computes the tangent of x, expressed in radians, to full double pre-
cision.
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 frac-
tion bits.
Example
To compute the tangent of theta:
y = tan(theta);
See Also
cos, sin
Notes
tan is packaged in the floating point library.
tanh
Description
Hyperbolic tangent
Syntax
#include <math.h>
double tanh(double x)
Function
tanh computes the value of the hyperbolic tangent of x to double preci-
sion.
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 repre-
sented, 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.
tolower
Description
Convert character to lower-case if necessary
Syntax
#include <ctype.h>
int tolower(int c)
Function
tolower converts an upper-case letter to its lower-case equivalent, leav-
ing all other characters unmodified.
Return Value
tolower returns the corresponding lower-case letter, or the unchanged
character.
Example
To accumulate a hexadecimal digit:
See Also
toupper
Notes
tolower is packaged in the integer library.
toupper
Description
Convert character to upper-case if necessary
Syntax
#include <ctype.h>
int toupper(int c)
Function
toupper converts a lower-case letter to its upper-case equivalent, leav-
ing all other characters unmodified.
Return Value
toupper returns the corresponding upper-case letter, or the unchanged
character.
Example
To convert a character string to upper-case letters:
See Also
tolower
Notes
toupper is packaged in the integer library.
va_arg
Description
Get pointer to next argument in list
Syntax
#include <stdarg.h>
type va_arg(va_list ap, type)
Function
The macro va_arg is an rvalue that computes the value of the next
argument in a variable length argument list. Information on the argu-
ment list is stored in the array data object ap. You must first initialize ap
with the macro va_start, and compute all earlier arguments in the list by
expanding va_arg for each argument.
The type of the next argument is given by the type name type. The type
name must be the same as the type of the next argument. Remember
that the compiler widens an arithmetic argument to int, and converts an
argument of type float to double. You write the type after conversion.
Write int instead of char and double instead of float.
Do not write a type name that contains any parentheses. Use a type def-
inition, if necessary, as in:
Return Value
va_arg expands to an rvalue of type type. Its value is the value of the
next argument. It alters the information stored in ap so that the next
expansion of va_arg accesses the argument following.
Example
To write multiple strings to a file:
#include <stdio.h>
#include <stdarg.h>
main()
{
void strput();
strput(pf, “This is one string\n”, \
“and this is another...\n”, (char *)0);
}
if (!ptr)
return;
else
{
puts(ptr);
va_start(va, ptr);
while (ptr = va_arg(va, char *)
puts(ptr);
va_end(va);
}
}
See Also
va_end, va_start
Notes
va_arg is a macro declared in the <stdarg.h> header file. You can use it
with any function that accepts a variable number of arguments, by
including <stdarg.h> with your program.
va_end
Description
Stop accessing values in an argument list
Syntax
#include <stdarg.h>
void va_end(va_list ap)
Function
va_end is a macro which you must expand if you expand the macro
va_start within a function that contains a variable length argument list.
Information on the argument list is stored in the data object designated
by ap. Designate the same data object in both va_start and va_end.
You expand va_end after you have accessed all argument values with
the macro va_arg, before your program returns from the function that
contains the variable length argument list. After you expand va_end, do
not expand va_arg with the same ap. You need not expand va_arg
within the function that contains the variable length argument list.
Return Value
Nothing. va_end expands to a statement, not an expression.
Example
To write multiple strings to a file:
#include <stdio.h>
#include <stdarg.h>
main()
{
void strput();
if (!ptr)
return;
else
{
puts(ptr);
va_start(va, ptr);
while (ptr = va_arg(va, char *)
puts(ptr);
va_end(va);
}
}
See Also
va_arg, va_start
Notes
va_end is a macro declared in the <stdarg.h> header file. You can use it
with any function that accepts a variable number of arguments, by
including <stdarg.h> with your program.
va_start
Description
Start accessing values in an argument list
Syntax
#include <stdarg.h>
void va_start(va_list ap, parmN)
Function
va_start is a macro which you must expand before you expand the
macro va_arg. It initializes the information stored in the data object
designated by ap. The argument parmN must be the identifier you
declare as the name of the last specified argument in the variable length
argument list for the function. In the function prototype for the function,
parmN is the argument name you write just before the ,...
If you expand va_start, you must expand the macro va_end before your
program returns from the function containing the variable length argu-
ment list.
Return Value
Nothing. va_start expands to a statement, not an expression.
Example
To write multiple strings to a file:
#include <stdio.h>
#include <stdarg.h>
main()
{
void strput();
strput(pf, “This is one string\n”, \
“and this is another...\n”, (char *)0);
}
if (!ptr)
return;
else
{
puts(ptr);
va_start(va, ptr);
while (ptr = va_arg(va, char *)
puts(ptr);
va_end(va);
}
}
See Also
va_arg, va_end
Notes
va_start is a macro declared in the <stdarg.h> header file. You can use
it with any function that accepts a variable number of arguments, by
including <stdarg.h> with your program.
vprintf
Description
Output arguments formatted to stdout
Syntax
#include <stdio.h>
#include <stdarg.h>
int vprintf(char *s, char fmt, va_list ap)
Function
vprintf writes formatted to the output stream using the format string at
fmt and the arguments specified by pointer ap, in exactly the same way
as printf. See the description of the printf function for information on
the format conversion specifiers. The va_start macro must be executed
before to call the vprintf function.
Return Value
vprintf returns the numbers of characters transmitted.
Example
To format a double at d into buf:
va_start(aptr, fmt);
vprintf(fmt, aptr);
See Also
printf, vsprintf
Notes
vprintf is packaged in both the integer library and the floating point
library. The functionality of the integer only version of vprintf is a sub-
set of the functionality of the floating point version. The integer only
version cannot print floating point numbers. If your programs call the
integer only version of vprintf, the following conversion specifiers are
invalid: e, E, f, g and G. The L flag is also invalid.
vsprintf
Description
Output arguments formatted to buffer
Syntax
#include <stdio.h>
#include <stdarg.h>
int vsprintf(char *s, char fmt, va_list ap)
Function
vsprintf writes formatted to the buffer pointed at by s using the format
string at fmt and the arguments specified by pointer ap, in exactly the
same way as printf. See the description of the printf function for infor-
mation on the format conversion specifiers. A NUL character is written
after the last character in the buffer. The va_start macro must be exe-
cuted before to call the vsprintf function.
Return Value
vsprintf returns the numbers of characters written, not including the ter-
minating NUL character.
Example
To format a double at d into buf:
va_start(aptr, fmt);
vsprintf(buf, fmt, aptr);
See Also
printf, vprintf
Notes
vsprintf is packaged in both the integer library and the floating point
library. The functionality of the integer only version of vsprintf is a sub-
set of the functionality of the floating point version. The integer only
version cannot print floating point numbers. If your programs call the
integer only version of vsprintf, the following conversion specifiers are
invalid: e, E, f, g and G. The L flag is also invalid.
wavhc12
Description
Evaluate weighted average
Syntax
#include <fuzzy.h>
char wavhc12(char *op1, char *op2, int nbval)
Function
wavhc12 computes the average of the a list of products between two
arrays provided by the arguments op1 and op2. The argument nbval
specifies the number of input values to be used. Refer to the “68HC12
Reference Manual”, for a complete description of the calculation.
Return Value
wavhc12 returns the average in the b register.
Example
res = wavhc12(tab_1, tab_2, 10);
See Also
memhc12, revhc12, revwhc12
Notes
wavhc12 is a builtin function declared in the <fuzzy.h> header file.
• Invoking ca6812
• Object File
• Listings
• Branch Optimization
• Old Syntax
• C Style Directives
• Assembler Directives
Invoking ca6812
ca6812 accepts the following command line options, each of which is
described in detail below:
+e* log errors from assembler in the text file * instead of dis-
playing the messages on the terminal screen.
-f# define the value of the filling byte used to fill any gap cre-
ated by the assembler directives. Default is 0.
+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.
-n* select the processor type. The default type is the 6812
processor. The allowed target is:
s: MCS12 family.
-pl put locals in the symbol table. They are not published as
externals and will be only displayed in the linker map file.
-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.
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.
Listings
The listing stream contains the source code used as input to the assem-
bler, 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:
Addresses in the listing output are the offsets from the start of the cur-
rent 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.
where ‘:’ indicates the end of a label and ‘;’ defines the start of a com-
ment. The end of a line terminates a comment. The command field may
be an instruction, a directive or a macro call.
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
ca6812 recognizes the following instructions:
tpa ; implicit
ldaa #1 ; immediate
anda var ; direct or extended
addd ,x ; indexed
orab 0,x ; indexed
ldd 1,y+ ; indexed
jmp [d,pc] ; indexed
bne loop ; relative
bset var,2 ; bit number
brset var,2,loop ; bit test and branch
The first syntax using the register name pc encoded the specified offset
directly in the instruction. The second syntax using the register name
pcr encodes in the instruction a relative value computed by substracting
the value of the current pc from the value of the specific offset. This is
mainly used with symbolic references.
ldd [symbol,pcr]
ldd [symbol] ; implied pcr
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 char-
acter ‘.’. It is continued by alphabetic (A-Z or a-z) or numeric (0,9)
characters, underscores, dollar signs ($) or periods. Labels are case sen-
sitive. The processor register names ‘a’, ‘b’, ‘x’ and ‘y’ are reserved and
cannot be used as labels.
data1:dc.b $56
c_reg:ds.b 1
wait: macro
\@loop:brset 1,PORTA,\@loop
endm
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 dec-
imal 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$: deca
bne 1$
2$: decb
bne 2$
Temporary labels do not appear in the symbol table or the cross refer-
ence list.
For example, to define 3 different local blocks and create and use 3 dif-
ferent local labels named 10$:
function1:
10$: ldab var
beq 10$
stab var2
local
10$: ldaa var2
beq 10$
staa var
rts
function2:
10$: ldaa var2
suba var
bne 10$
rts
Constants
The assembler accepts numeric constants and string constants.
Numeric constants are expressed in different bases depending on a
prefix character as follows:
Number Base
10 decimal (no prefix)
%1010 binary
@12 octal
$A hexadecimal
Suffix Base
D, d or none decimal (no prefix)
B or b binary
Q or q octal
0AH or 0Ah hexadecimal
‘This is a string’
“This is also a string”
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.
+ 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
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.
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.
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:
The resulting code will be the same as if the following code had been
written:
And called:
name>[.<ext>] [<arguments>]
table: macro
dc.\0 1,2,3,4
endm
table.b
dc.b 1,2,3,4
table.w
dc.w 1,2,3,4
The directive mexit may be used at any time to stop the macro expan-
sion. It is generally used in conjunction with a conditional directive.
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 con-
dition 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 debug == 1
ldx #message
jsr print
endif
If the symbol debug is equal to 1, the next two lines are assembled. Oth-
erwise they are skipped.
If the symbol offset is not one, the macro addptr is expanded with off-
set as argument, otherwise the inx instruction is directly assembled.
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 follow-
ing code and data thereto. The directive switch can be used to redirect
the following code and data to another section.
Section Description
.text executable code
.data initialized data
.bss uninitialized data
.bsct initialized data in zero page
.ubsct uninitialized 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.
xref var
xref.b zvar
switch .bsct
zvar2: ds.b 1
switch .bss
var2: ds.b 1
switch .text
ldaa var
ldaa zvar
ldaa var2
ldaa var2
end
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.
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.
Old Syntax
The -m option allows the assembler to accept old constructs which are
now obsolete. The following features are added to the standard behav-
iour:
• a label starting in the first column does not need to be ended with
a ‘:’ character;
The comment separator at the end of an instruction is still the ‘;’ charac-
ter because the ‘*’ character is interpreted as the multiply operator.
C Style Directives
The assembler also supports C style directives matching the preproces-
sor directives of a C compiler. The following directives list shows the
equivalence with the standard directives:
NOTE
The #define directive does not implement all the text replacement fea-
tures 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
ca6812 assembler directives.
align
Description
Align the next instruction on a given boundary
Syntax
align <expression>,[<fill_value>]
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 <fill_value>, is specified, it will be used locally as the filling
byte, instead of the one specified by the -f option.
Example
align 3 ; next address is multiple of 3
ds.b 1
See Also
even
base
Description
Define the default base for numerical constants
Syntax
base <expression>
Function
The base directive sets the default base for numerical constants begin-
ning with a digit. The base directive is followed by a constant expres-
sion 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 8 ; select octal base
lda #377 ; load $FF
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
direct 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
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
dc
Description
Allocate constant(s)
Syntax
dc[.size] <expression>[,<expression>...]
Function
The dc directive allocates and initializes storage for constants. If
<expression> is a string constant, one byte is allocated for each charac-
ter 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 <expression>.
The dc.l directive will allocate one long word per <expression>.
Example
digit:dc.b10,'0123456789'
dc.wdigit
Note
For compatibility with previous assemblers, the directive fcb is alias to
dc.b, and the directive fdb is alias to dc.w.
dcb
Description
Allocate constant block
Syntax
dcb.<size> <count>,<value>
Function
The dcb directive allocates a memory block and initializes storage for
constants. The size area is the number of the specified value <count> of
<size>. The memory area can be initialized with the <value> specified.
The dcb and dcb.b directives will allocate one byte per <count>.
The dcb.l directive will allocate one long word per <count>.
Example
digit:dcb.b 10,5 ; allocate 10 bytes,
; all initialized to 5
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.
ds
Description
Allocate variable(s)
Syntax
ds[.size] <space>
Function
The ds directive allocates storage space for variables. < space> must be
an absolute expression. Bytes created are set to the value of the filling
byte defined by the -f option.
Example
ptlec:ds.b 2
ptecr:ds.b 2
chrbuf:ds.w 128
Note
For compatibility with previous assemblers, the directive rmb is alias
to ds.b.
else
Description
Conditional assembly
Syntax
if <expression>
instructions
else
instructions
endif
Function
The else directive follows an if directive to define an alternative condi-
tional sequence. It reverts the condition status for the following instruc-
tions up to the next matching endif directive. An else directive applies
to the closest previous if directive.
Example
if offset != 1 ; if offset too large
addptr offset ; call a macro
else ; otherwise
inx ; increment X register
endif
Note
The else and elsec directives are equivalent and may used without dis-
tinction. They are provided for compatibility with previous assemblers.
See Also
if, endif, clist
elsec
Description
Conditional assembly
Syntax
if <expression>
instructions
elsec
instructions
endc
Function
The elsec directive follows an if directive to define an alternative condi-
tional sequence. It reverts the condition status for the following instruc-
tions up to the next matching endc directive. An elsec directive applies
to the closest previous if directive.
Example
ifge offset-127 ; if offset too large
addptr offset ; call a macro
elsec ; otherwise
inx ; increment X register
endc
Note
The elsec and else directives are equivalent and may used without dis-
tinction. They are provided for compatibility with previous assemblers.
See Also
if, endc, clist, else
end
Description
Stop the assembly
Syntax
end
Function
The end directive stops the assembly process. Any statements follow-
ing it are ignored. If the end directive is encountered in an included file,
it will stop the assembly process for the included file only.
endc
Description
End conditional assembly
Syntax
if<cc> <expression>
instructions
endc
Function
The endc directive closes an if<cc> or elsec conditional directive. The
conditional status reverts to the one existing before entering the if<cc>
directives. The endc directive applies to the closest previous if<cc> or
elsec directive.
Example
ifge offset-127 ; if offset too large
addptr offset ; call a macro
elsec ; otherwise
inx ; increment X register
endc
Note
The endc and endif directives are equivalent and may used without dis-
tinction. They are provided for compatibility with previous assemblers.
See Also
if<cc>, elsec, clist, end
endif
Description
End conditional assembly
Syntax
if <expression>
instructions
endif
Function
The endif directive closes an if or else conditional directive. The condi-
tional 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 offset != 1 ; if offset too large
addptr offset ; call a macro
else ; otherwise
inx ; increment X register
endif
Note
The endif and endc directives are equivalent and may used without dis-
tinction. They are provided for compatibility with previous assemblers.
See Also
if, else, clist
endm
Description
End macro definition
Syntax
label: macro
<macro_body>
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:macro
ds.b \@2 - \@1
\@1:
ds.b \1
\@2:
endm
See Also
mexit, macro
endr
Description
End repeat section
Syntax
repeat
<macro_body>
endr
Function
The endr directive is used to terminate repeat sections.
Example
; shift a value n times
asln: macro
repeat \1
aslb
endr
endm
See Also
repeat, repeatl
equ
Description
Give a permanent value to a symbol
Syntax
label: equ <expression>
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.
<expression> must be either a constant expression, or a relocatable
expression involving a symbol declared in the same section as the cur-
rent one.
Example
false:equ 0 ; initialize these values
true: equ 1
tablen:equ tabfin - tabsta;compute table length
nul: equ $0 ; define strings for ascii characters
soh: equ $1
stx: equ $2
etx: equ $3
eot: equ $4
enq: equ $5
See Also
set
even
Description
Assemble next byte at the next even address relative to the start of a
section.
Syntax
even [<fill_value>]
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 fill-
ing byte defined by the -f option. If <fill_value> is specified, it will be
used locally as the filling byte, instead of the one specified by the -f
option.
Example
vowtab:dc.b 'aeiou'
even ; ensure aligned at even address
tentab:dc.w 1, 10, 100, 1000
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 512
ifge value - Max
fail “Value too large”
if
Description
Conditional assembly
Syntax
if <expression> or if <expression>
instructions instructions
endif 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.
The if directives may be nested. The skipped lines may or may not in
the listing depending on the clist directive status.
Example
if offset != 1 ; if offset too large
addptr offset ; call a macro
else ; otherwise
inx ; increment X register
endif
See Also
else, endif, clist
ifc
Description
Conditional assembly
Syntax
ifc <string1>,<string2> orifc <string1>,<string2>
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 <string1> and
<string2> are equals, the following instructions are assembled up to the
next matching endc or elsec directive; otherwise, the following instruc-
tions 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 instruc-
tions 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 in
the listing depending on the clist directive status.
Example
ifc “hello”, \2 ; if “hello” equals argument
ldab #45 ; load 45
elsec ; otherwise...
ldab #0
endc
See Also
elsec, endc, clist
ifdef
Description
Conditional assembly
Syntax
ifdef <label> or ifdef <label>
instructions instructions
endc elsec
instructions
endc
Function
The ifdef, elsec and endc directives allow conditional assembly. The
ifdef directive is followed by a label <label>. If <label> is defined, 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. <label> must be first
defined. It cannot be a forward reference.
If the ifdef 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 endif. So, if the ifdef expression was not zero, the
instructions between elsec and endc are skipped; otherwise, the instruc-
tions 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
ifdef offset1 ; if offset1 is defined
addptr offset1 ; call a macro
elsec ; otherwise
addptr offset2 ; call a macro
endif
See Also
ifndef, elsec, endc, clist
ifeq
Description
Conditional assembly
Syntax
ifeq <expression> or ifeq <expression>
instructions instructions
endc elsec
instructions
endc
Function
The ifeq, elsec and endc directives allow conditional assembly. The
ifeq directive is followed by a constant expression. If the result of the
expression is equal to zero, 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 ifeq 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 ifeq expression is equal to 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 in
the listing depending on the clist directive status.
Example
ifeq offset ; if offset nul
tsta ; just test it
elsec ; otherwise
add #offset ; add to accu
endc
See Also
elsec, endc, clist
ifge
Description
Conditional assembly
Syntax
ifge <expression> or ifge <expression>
instructions instructions
endc elsec
instructions
endc
Function
The ifge, elsec and endc directives allow conditional assembly. The
ifge directive is followed by a constant expression. If the result of the
expression is greater or equal to zero, 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 direc-
tive are skipped.
If the ifge 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 ifge expression is greater or equal
to zero, the instructions between elsec and endc are skipped; otherwise,
the instructions between elsec and endc are assembled. An elsec direc-
tive applies to the closest previous if directive.
The if directives may be nested. The skipped lines may or may not in
the listing depending on the clist directive status.
Example
ifge offset-127 ; if offset too large
addptr offset ; call a macro
elsec ; otherwise
inx ; increment X register
endc
See Also
elsec, endc, clist
ifgt
Description
Conditional assembly
Syntax
ifgt <expression> or ifgt <expression>
instructions instructions
endc elsec
instructions
endc
Function
The ifgt, elsec and endc directives allow conditional assembly. The ifgt
directive is followed by a constant expression. If the result of the
expression is greater than zero, the following instructions are assem-
bled up to the next matching endc or elsec directive; otherwise, the fol-
lowing instructions up to the next matching endc or elsec directive are
skipped.
If the ifgt 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 ifgt expression was greater than
zero, the instructions between elsec and endc are skipped; otherwise,
the instructions between elsec and endc are assembled. An elsec direc-
tive applies to the closest previous if directive.
The if directives may be nested. The skipped lines may or may not in
the listing depending on the clist directive status.
Example
ifgt offset-127 ; if offset too large
addptr offset ; call a macro
elsec ; otherwise
inx ; increment X register
endc
See Also
elsec, endc, clist
ifle
Description
Conditional assembly
Syntax
ifle <expression> or ifle <expression>
instructions instructions
endc elsec
instructions
endc
Function
The ifle, elsec and endc directives allow conditional assembly. The ifle
directive is followed by a constant expression. If the result of the
expression is less or equal to zero, 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 direc-
tive are skipped.
If the ifle 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 ifle expression was less or equal to
zero, the instructions between elsec and endc are skipped; otherwise,
the instructions between elsec and endc are assembled. An elsec direc-
tive applies to the closest previous if directive.
The if directives may be nested. The skipped lines may or may not in
the listing depending on the clist directive status.
Example
ifle offset-127 ; if offset small enough
inx ; increment X register
elsec ; otherwise
addptr offset ; call a macro
endc
See Also
elsec, endc, clist
iflt
Description
Conditional assembly
Syntax
iflt <expression> or iflt <expression>
instructions instructions
endc elsec
instructions
endc
Function
The iflt, else and endc directives allow conditional assembly. The iflt
directive is followed by a constant expression. If the result of the
expression is less than zero, the following instructions are assembled
up to the next matching endc or elsec directive; otherwise, the follow-
ing instructions up to the next matching endc or elsec directive are
skipped.
If the iflt 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 iflt expression was less than 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 in
the listing depending on the clist directive status.
Example
iflt offset-127 ; if offset small enough
inx ; increment X register
elsec ; otherwise
addptr offset ; call a macro
endc
See Also
elsec, endc, clist
ifnc
Description
Conditional assembly
Syntax
ifnc <string1>,string2> or ifnc <string1><string2>
instructions instructions
endc elsec
instructions
endc
Function
The ifnc, elsec and endc directives allow conditional assembly. The
ifnc directive is followed by a constant expression. If <string1> and
<string2> are differents, 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 ifnc 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 ifnc expression was not zero, the
instructions between elsec and endc are skipped; otherwise, the instruc-
tions 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 in
the listing depending on the clist directive status.
Example
ifnc “hello”, \2
addptr offset ; call a macro
else ; otherwise
inx ; increment X register
endif
See Also
elsec, endc, clist
ifndef
Description
Conditional assembly
Syntax
ifndef <label> or ifndef <label>
instructions instructions
endc elsec
instructions
endc
Function
The ifndef, else and endc directives allow conditional assembly. The
ifndef directive is followed by a label <label>. If <label> is not
defined, the following instructions are assembled up to the next match-
ing endc or elsec directive; otherwise, the following instructions up to
the next matching endc or elsec directive are skipped. <label> must be
first defined. It cannot be a forward reference.
The if directives may be nested. The skipped lines may or may not be in
the listing depending on the clist directive status.
Example
ifndef offset1 ; if offset1 is not defined
addptr offset2 ; call a macro
elsec ; otherwise
addptr offset1 ; call a macro
endif
See Also
ifdef, elsec, endc, clist
ifne
Description
Conditional assembly
Syntax
ifne <expression> or ifne <expression>
instructions instructions
endc elsec
instructions
endc
Function
The ifne, elsec and endc directives allow conditional assembly. The
ifne directive is followed by a constant expression. If the result of the
expression is not equal to zero, the following instructions are assem-
bled up to the next matching endc or elsec directive; otherwise, the fol-
lowing instructions up to the next matching endc or elsec directive are
skipped.
If the ifne 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 ifne expression was not equal to
zero, the instructions between elsec and endc are skipped; otherwise,
the instructions between elsec and endc are assembled. An elsec direc-
tive applies to the closest previous if directive.
The if directives may be nested. The skipped lines may or may not in
the listing depending on the clist directive status.
Example
ifne offset ; if offset not nul
add #offset ; add to accu
elsec ; otherwise
tsta ; just test it
endc
See Also
elsec, endc, clist
include
Description
Include text from another text file
Syntax
include "filename"
Function
The include directive causes the assembler to switch its input to the
specified filename until end of file is reached, at which point the assem-
bler resumes input from the line following the include directive in the
current file. The directive is followed by a string which gives the name
of the file to be included. This string must match exactly the name and
extension of the file to be included; the host system convention for
uppercase/lowercase characters should be respected.
Example
include “datstr” ; use data structure library
include “bldstd” ; use current build standard
include “matmac” ; use maths macros
include “ports82” ; use ports definition
list
Description
Turn on listing during assembly.
Syntax
list
Function
The list directive controls the parts of the program which will be written
to the listing file. It is effective if and only if listings are requested; it is
ignored otherwise.
Example
list ; expand source code until end or nolist
dc.b 1,2,4,8,16
end
See Also
nolist
local
Description
Create a new local block
Syntax
local
Function
The local directive is used to create a new local block. When the local
directive is used, all temporary labels defined before the local directive
will be undefined after the local label. New local labels can then be
defined in the new local block. Local labels can only be referenced
within their own local block. A local label block is the area between
two standard labels or local directives or a combination of the two.
Example
var: ds.b 1
var2: ds.b 1
function1:
10$: ldab var
beq 10$
stab var2
local
10$: ldaa var2
beq 10$
staa var
rts
macro
Description
Define a macro
Syntax
label: macro<argument_list>
<macro_body>
endm
Function
The macro directive is used to define a macro. The name may be any
previously unused name, a name already used as a macro, or an instruc-
tion mnemonic for the microprocessor.
Example
; define a macro that places the length of a string
; in a byte in front of the string using numbered syntax
;
ltext:macro
dc.b \@2-\@1
\@1:
dc.b \1 ; text given as first operand
\@2:
endm
See Also
endm, mexit
messg
Description
Send a message out to STDOUT
Syntax
messg “<text>”
messg ‘<text>’
Function
The messg directive is used to send a message out to the host system’s
standard output (STDOUT).
Example
messg “Test code for debug”
ldaa _#2
staa _SCR
See Also
title
mexit
Description
Terminate a macro definition
Syntax
mexit
Function
The mexit directive is used to exit from a macro definition before the
endm directive is reached. mexit is usually placed after a conditional
assembly directive.
Example
ctrace:macro
if tflag == 0
mexit
endif
jsr \1
endm
See Also
endm, macro
mlist
Description
Turn on or off listing of macro expansion.
Syntax
mlist [on|off]
Function
The mlist directive controls the parts of the program which will be writ-
ten to the listing file produced by a macro expansion. It is effective if
and only if listings are requested; it is ignored otherwise.
The parts of the program to be listed are the lines which are assembled
in a macro expansion.
See Also
macro
nolist
Description
Turn off listing.
Syntax
nolist
Function
The nolist directive controls the parts of the program which will be not
written to the listing file until an end or a list directive is encountered. It
is effective if and only if listings are requested; it is ignored otherwise.
See Also
list
Note
For compatibility with previous assemblers, the directive nol is alias to
nolist.
nopage
Description
Disable pagination in the listing file
Syntax
nopage
Function
The nopage directive stops the pagination mechanism in the listing out-
put. It is ignored if no listing has been required.
Example
xref mult, div
nopage
ds.b charin, charout
ds.w a, b, sum
See Also
plen, title
offset
Description
Creates absolute symbols
Syntax
offset <expresion>
Function
The offset directive starts an absolute section which will only be used to
define symbols, and not to produce any code or data. This section starts
at the address specified by <expression>, and remains active while no
directive or instructions producing code or data is entered. This abso-
lute section is then destroyed and the current section is restored to the
one which was active when the offset directive has been entered. All the
labels defined is this section become absolute symbols.
Example
offset0
next:
ds.b 2
buffer:
ds.b 80
switch .text
size:
ldy next,x ; ends the offset section
org
Description
Sets the location counter to an offset from the beginning of a section.
Syntax
org <expresion>
Function
<expression> must be a valid absolute expression. It must not contain
any forward or external references.
For an absolute section, the first org before any code or data defines the
starting address.
Any gap created by an org directive is filled with the byte defined by
the -f option.
page
Description
Start a new page in the listing file
Syntax
page
Function
The page directive causes a formfeed to be inserted in the listing output
if pagination is enabled by either a title directive or the -ft option.
Example
xref mult, div
page
ds.b charin, charout
ds.w a, b, sum
See Also
plen, title
plen
Description
Specify the number of lines per pages in the listing file
Syntax
plen <page_length>
Function
The plen directive causes <page_length> lines to be output per page in
the listing output if pagination is enabled by either a title directive or
the -ft option. If the number of lines already output on the current page
is less than <page_length>, then the new page length becomes effec-
tive with <page_length>. If the number of lines already output on the
current page is greater than or equal to <page_length>, a new page will
be started and the new page length is set to <page_length>.
Example
plen 58
See Also
page, title
repeat
Description
Repeat a list of lines a number of times
Syntax
repeat <expression>
repeat_body
endr
Function
The repeat directive is used to cause the assembler to repeat the follow-
ing list of source line up to the next endr directive. The number of
times the source lines will be repeated is specified by the expression
operand. The repeat directive is equivalent to a macro definition fol-
lowed by the same number of calls on that macro.
Example
; shift a value n times
asln: macro
repeat \1
aslb
endr
endm
See Also
endr, repeatl, rexit
repeatl
Description
Repeat a list of lines a number of times
Syntax
repeatl <arguments>
repeat_body
endr
Function
The repeatl directive is used to cause the assembler to repeat the fol-
lowing list of source line up to the next endr directive. The number of
times the source lines will be repeated is specified by the number of
arguments, separated with commas (with a maximum of 36 arguments)
and executed each time with the value of an argument. The repeatl
directive is equivalent to a macro definition followed by the same
number of calls on that macro with each time a different argument. The
repeat argument is denoted \1 unless the argument list is starting by a
name prefixed by a \ character. In such a case, the repeat argument is
specified by its name prefixed by a \ character.
Example
; test a value using the numbered syntax
repeatl1,2,3
addd #\1 ; add to accu
endr
end
or
; test a value using the named syntax
repeatl\count,1,2,3
addd #\count; add to accu
endr
end
2 ; test a value
9 0000 c30001 addd #1 ; add to accu
9 0003 c30002 addd #2 ; add to accu
9 0006 c30003 addd #3 ; add to accu
10 end
See Also
endr, repeat, rexit
restore
Description
Restore saved section
Syntax
restore
Function
The restore directive is used to restore the last saved section. This is
equivalent to a switch to the saved section.
Example
switch.bss
var: ds.b 1
var2: ds.b 1
save
switch .text
function1:
10$: ldab var
beq 10$
stab var2
function2:
10$: ldaa var2
suba var
bne 10$
rts
restore
var3: ds.b 1
var4: ds.b 1
switch .text
ldaa var3
staa var4
end
See Also
save, section
rexit
Description
Terminate a repeat definition
Syntax
rexit
Function
The rexit directive is used to exit from a repeat definition before the
endr directive is reached. rexit is usually placed after a conditional
assembly directive.
Example
; shift a value n times
asln: macro
repeat \1
if \1 == 0
rexit
endif
aslb
endr
endm
See Also
endr, repeat, repeatl
save
Description
Save section
Syntax
save
Function
The save directive is used to save the current section so it may be
restored later in the source file.
Example
switch.bss
var: ds.b 1
var2: ds.b 1
save
switch .text
function1:
10$: ldab var
beq 10$
stab var2
function2:
10$: ldaa var2
suba var
bne 10$
rts
restore
var3: ds.b 1
var4: ds.b 1
switch .text
ldaa var3
staa var4
end
See Also
restore, section
section
Description
Define a new section
Syntax
<section_name>: section [<attributes>]
Function
The section directive defines a new section, and indicates that the fol-
lowing program is to be assembled into a section named
<section_name>. The section directive cannot be used to redefine an
already existing section. If no name and no attributes are specified to
the section, the default is to defined the section as a text section with its
same attributes. It is possible to associate <attributes> to the new sec-
tion. An attribute is either the name of an existing section or an attribute
keyword. Attributes may be added if prefixed by a ‘+’ character or not
prefixed, or deleted if prefixed by a ‘-’ character. Several attributes may
be specified separated by commas. Attribute keywords are:
Example
CODE: section.text; section of text
lab1: ds.b5
DATA: section.data; section of data
lab2: ds.b6
switchCODE
lab3: ds.b7
switchDATA
lab4: ds.b8
This will place lab1 and then lab3 into consecutive locations in sec-
tion CODE and lab2 and lab4 in consecutive locations in section
DATA.
.frame:section.bsct,even
The .frame section is declared with same attributes than the .bsct sec-
tion and with the even attribute.
.bit: section+zpage,+even,-hilo
The .bit section is declared using 8 bit relocation, with an even align-
ment and storing data with an ascending order of significance.
When the -m option is used, the section directive also accepts a number
as operand. In that case, a labelled directive is considered as a section
definition, and an unlabelled directive is considered as a section open-
ing (switch).
See Also
switch, bsct
set
Description
Give a resetable value to a symbol
Syntax
label: set <expression>
Function
The set directive allows a value to be associated with a symbol. Sym-
bols declared with set may be altered by a subsequent set. The equ
directive should be used for symbols that will have a constant value.
<expression> must be fully defined at the time the equ directive is
assembled.
Example
OFST: set 10
See Also
equ
spc
Description
Insert a number of blank lines before the next statement in the listing
file.
Syntax
spc <num_lines>
Function
The spc directive causes <num_lines> blank lines to be inserted in the
listing output before the next statement.
Example
spc 5
title “new file”
If listing is requested, 5 blank lines will be inserted, then the title will be
output.
See Also
title
switch
Description
Place code into a section.
Syntax
switch <section_name>
Function
The switch directive switches output to the section defined with the
section directive. <section_name> is the name of the target section,
and has to be already defined. All code and data following the switch
directive up to the next section, switch, bsct or end directive are placed
in the section <section_name>.
Example
switch .bss
buffer:ds.b 512
xdef buffer
See Also
section, bsct
tabs
Description
Specify the number of spaces for a tab character in the listing file
Syntax
tabs <tab_size>
Function
The tabs directive sets the number of spaces to be substituted to the tab
character in the listing output. The minimum value of <tab_size> is 0
and the maximum value is 128.
Example
tabs 6
title
Description
Define default header
Syntax
title "name"
Function
The title directive is used to enable the listing pagination and to set the
default page header used when a new page is written to the listing out-
put.
Example
title “My Application”
See Also
messg, page, plen
Note
For compatibility with previous assemblers, the directive ttl is alias to
title.
xdef
Description
Declare a variable to be visible
Syntax
xdef identifier[,identifier...]
Function
Visibility of symbols between modules is controlled by the xdef and
xref directives. A symbol may only be declared as xdef in one module.
A symbol may be declared both xdef and xref in the same module, to
allow for usage of common headers.
Example
xdef sqrt; allow sqrt to be called
; from another module
sqrt: ; routine to return a square root
; of a number >= zero
See Also
xref
xref
Description
Declare symbol as being defined elsewhere
Syntax
xref[.b] identifier[,identifier...]
Function
Visibility of symbols between modules is controlled by the xref and
xdef directives. Symbols which are defined in other modules must be
declared as xref. A symbol may be declared both xdef and xref in the
same module, to allow for usage of common headers.
The directive xref.b declares external symbols located in the .bsct sec-
tion.
Example
xref otherprog
xref.b zpage ; is in .bsct section
See Also
xdef
xref.5
Description
Declare a special external symbol
Syntax
xref.5 identifier[,identifier...]
Function
The directive xref.5 declares external symbols to be handled as 5 bits
signed values, allowing the assembler to encode an indexed addressing
mode with the smallest size as possible. The linker will verify that the
final value is compatible with the encoded addressing mode, and will
output an error message if not.
Example
xref.5small
See Also
xref, xref.9
xref.9
Description
Declare a special external symbol
Syntax
xref.9 identifier[,identifier...]
Function
The directive xref.9 declares external symbols to be handled as 9 bits
signed values, allowing the assembler to encode an indexed addressing
mode with the appropriate size. The linker will verify that the final
value is compatible with the encoded addressing mode, and will output
an error message if not.
Example
xref.9 medium
See Also
xref, xref.9
• Introduction
• Overview
• Linker Options
• Section Relocation
• Linking Objects
• Bank Switching
• Moveable Code
• Checksum Computation
• Special Topics
Introduction
The linker combines relocatable object files, selectively loading from
libraries of such files made with clib, to create an executable image for
standalone execution or for input to other binary reformatters.
clnk will also allow the object image that it creates to have local symbol
regions, so the same library can be loaded multiple times for different
segments, and so that more control is provided over which symbols are
exposed. On microcontroller architectures this feature is useful if your
executable image must be loaded into several noncontiguous areas in
memory.
NOTE
The terms “segment” and “section” refer to different entities and are
carefully kept distinct throughout this chapter. A “section” is a contigu-
ous subcomponent of an object module that the linker treats as indivisi-
ble.
For most applications, the “sections” in an object module that the linker
accepts as input are equivalent to the “segments” of the executable
image that the linker generates as output.
Overview
You use the linker to build your executable program from a variety of
modules. These modules can be the output of the C cross compiler, or
can be generated from handwritten assembly language code. Some
modules can be linked unconditionally, while others can be selected
only as needed from function libraries. All input to the linker, regard-
less of its source, must be reduced to object modules, which are then
combined to produce the program file.
The output of the linker can be in the same format as its input. Thus, a
program can be built in several stages, possibly with special handling at
some of the stages. It can be used to build freestanding programs such
as system bootstraps and embedded applications. It can also be used to
make object modules that are loaded one place in memory but are
designed to execute somewhere else. For example, a data section in
ROM to be copied into RAM at program startup can be linked to run at
its actual target memory location. Pointers will be initialized and
address references will be in place.
In most cases, the final program file created by clnk is structurally iden-
tical to the object module input to clnk. The only difference is that the
executable file is complete and contains everything that it needs to run.
There are a variety of utilities which will take the executable file and
convert it to a form required for execution in specific microcontroller
environments. The linker itself can perform some conversions, if all
that is required is for certain portions of the executable file to be
stripped off and for sections to be relocated in a particular way. You can
therefore create executable programs using the linker that can be passed
directly to a PROM programmer.
• The final output of the linker is a header, followed by all the sec-
tions and the symbol table. There may also be an additional debug
symbol table, which contains information used for debugging pur-
poses.
Group 1
(+seg <section>) controls the creation of new segments and has
parameters which are selected from the set of local flags.
Group 2
(+inc*) is used to include files
Group 3
(+new, +pub and +pri) controls name regions and takes no parame-
ters.
Group 4
(+def <symbol>) is used to define symbols and aliases and takes one
required parameter, a string of the form ident1=ident2, a string of the
form ident1=constant, or a string of the form ident1=@segment.
Group 5
(+spc <segment>) is used to reserve space in a particular <segment>
and has a required parameter
The manner in which the linker relocates the various sections is control-
led by the +seg option and its parameters. If the size of a current seg-
ment is zero when a command to start a new segment of the same name
is encountered, it is discarded. Several different sections can be redi-
rected directly to the same segment by using the +grp option.
Linker Options
The linker accepts the following options, each of which is described in
detail below.
The output file name and the link command file must be present on
the command line. The options are described in terms of the two groups
listed above; the global options that apply to the linker, and the segment
control options that apply only to specific segments.
-bs# set the window shift to #, which implies that the number of
bytes in a window is 2**#. The default value is 14 (bank
switching enabled). For more information, see the section
“Address Arithmetic” on page 288.
-e* log errors in the text file * instead of displaying the mes-
sages on the terminal screen.
-o* write output to the file *. This option is required and has no
default value.
-v be “verbose”.
NOTE
Applications not using bank switching should specified the -bs0 option to
disabled the internal banking verification.
-ck mark the segment you want to check. For more informa-
tion, see “Checksum Computation” on page 298.
-ds# set the bank size for paged addresses calculation. This
option overwrites the global -bs option for that segment.
-s* define a space name for the segment. This segment will be
verified for overlapping only against segments defined
with the same space name.
-w* set the window size for banked applications, and activate
the automatic bank segment creation.
+def START=0x1000
+def MAXSIZE=0x2000
+seg .text -bSTART+0x100 -mMAXSIZE-0x100
The first line defines the symbol START equals to the absolute value
1000 (hex value), the second line defines the symbol MAXSIZE equals
to the absolute value 2000 (hex value). The last line opens a .text seg-
ment located at 1100 (hex value) with a maximum size of 1f00 (hex
value). For more information, see the section “Symbol Definition
Option” on page 286.
Unless -b* is given to set the bss segment start address, the bss segment
will be made to follow the last data segment in the output file. Unless
-b* is given to set the data segment start address, the data segment will
be made to follow the last bsct segment in the output file. The bsct and
text sections are set to start at zero unless you specify otherwise by
using -b option. It is permissible for all segments to overlap, as far as
clnk is concerned; the target machine may or may not make sense of
this situation (as with separate instruction and data spaces).
NOTE
A new segment of the specified type will not actually be created if the last
segment of the same name has a size of zero. However, the new options
will be processed and will override the previous values.
Segment Grouping
Different sections can be redirected directly to the same segment with
the +grp directive:
where <section> is the name of the target section, and <section list> a
list of section names separated by commas. When loading an object file,
each section listed in the right part of the declaration will be loaded as if
it was named as defined in the left part of the declaration. The target
section may be a new section name or the name of an existing section
(including the predefined ones). When using a new name, this directive
has to be preceded by a matching +seg definition.
NOTE
Whitespaces are not allowed aside the equal sign ‘=’ and the commas.
@1, @2,... include each individual object file at its positional location
on the command line and insert them at the respective
locations in the link file (@1 is the first object file, and so
on).
Example
Linking objects from the command line:
## Test.lkf:
+seg .text -b0x5000
+seg .data -b0x100
@1
+seg .text -b0x7000
@2
Is equivalent to
Include Option
Subparts of the link command file can be included from other files by
using the following option:
Example
Include the file “ seg2.txt” in the link file “test.lkf”:
## Test.lkf:
+seg .text -b0x5000
+seg .data -b0x100
file1.o file2.o
+seg .text -b0x7000
+inc seg2.txt
## seg2.txt:
mod1.o mod2.o mod3.o
NOTE
Whitespaces are not allowed aside the equal sign ‘=’.
For more information about DEFs and REFs, refer to the section “DEFs
and REFs” on page 300.
NOTE
Whitespaces are not allowed aside the equal sign ‘=’.
Section Relocation
The linker relocates the sections of the input files into the segments of
the output file.
Address Arithmetic
The two most important parameters describing a segment are its bias
and its offset, respectively its physical and logical start addresses. In
nonsegmented architectures there is no distinction between bias and off-
set. The bias is the address of the location in memory where the section
is relocated to run. The offset of a segment will be equal to the bias. In
this case you must set only the bias. The linker sets the offset automati-
cally.
The window shift specified by the -bs# option gives a measure of the
resolution used to hold the bias value of a segment. If the value speci-
fied by the -bs# option is n, then the resolution is 2**n. For example,
the value of n is 14 for the MC68HC12.
bias = offset
Overlapping Control
The linker is verifying that a segment does not overlap any other one,
by checking the physical addresses (bias). This control can be locally
disabled for one segment by using the -v option. For targets implement-
ing separated address spaces (such as bank switching), the linker allows
several segments to be isolated from the other ones, by giving them a
space name with the -s option. In such a case, a segment in a named
space is checked only against the other segments of the same space. The
unnamed segments are checked together.
Linking Objects
A new segment is built by concatenating the corresponding sections of
the input object modules in the order the linker encounters them. As
each input section is added to the output segment, it is adjusted to be
relocated relative to the end portion of the output segment so far con-
structed. The first input object module encountered is relocated relative
to a value that can be specified to the linker. The size of the output bss
section is the sum of the sizes of the input bss sections.
Library Order
You should link your application with the libraries in the following
orders:
NOTE
The libe.h12 is only necessary when building applications using eeprom
functions and targeting the DP256 derivative.
Bank Switching
The linker is able to build banked segments for large applications. Such
banks can be built explicitly, or automatically. A banked segment is
described by a physical start address, specified by the -b option, a logi-
cal start address, specified by the -o option, and a window size. The log-
ical address is the processor address, and should match the windowed
area (0x8000 to 0xbfff for the 68HC12). The physical address is the
memory address and should match the hardware specifications.
A single bank is defined by using the -b and -o only. The bank size
should be specified by the -m option to check any bank overflow. Sev-
eral banks can be defined by several independent segment directives.
The following link file shows the use of a multiple banks: the -w option
specifies a size of the window ( 0x4000). In this case, when the current
bank size exceeds, a new segment is created with a logical start address
of 0x8000, and the new physical address will be 0xc000.
The linker also verifies that a bank is properly entered with a call
instruction. Any attempt to enter a bank with a jsr instruction will be
reported as an error, unless the jsr is issued from the same bank.
Then, clnk looks in the executable file for initialized segments. All the
segments .data and .bsct are selected by default, unless disabled explic-
itly by the -ib option. Otherwise, renamed segments may also be
selected by using the -id option. The -id option cannot be specified on a
bss segment, default or renamed. Once all the selected segments are
located, clnk builds a descriptor containing the starting address and
length of each such segment, and moves the descriptor and the selected
segments to the end of the host segment, without relocating the content
of the selected segments.
Descriptor Format
The created descriptor has the following format:
The flag byte is used to detect the end of the descriptor, and also to
specify a type for the data segment. The actual value is equal to the
code of the first letter in the segment name.
The end address in PROM of one segment gives also the starting
address in prom of the following segment, if any.
If the host segment has been opened with a -m option giving a maxi-
mum size, clnk will check that there is enough space to move all the
selected segments.
Moveable Code
The linker allows a code section to be stored in the ROM part, but
linked at another address which is supposed to be located in RAM. This
feature is specially designed to allow an application to run FLASH pro-
gramming routines from the RAM space. This feature is sharing the
same global mechanism than initialized data, and the common descrip-
tor built by the linker contains both record types. The flag byte is used
to qualify each entry. In order to implement such a feature, the link
command file should contain a dedicated code segment marked with the
-ic option:
The function contained in the object flash.o is now linked at the RAM
address 0x100 but stored somewhere in the code space along with any
other initialized data. It is not necessary to link the application with the
startup routine crtsi.s if the application does not contain initialized data
but the descriptor will be built as soon as a moveable function is used
by the application, but if the crtsi.s startup is used, moveable code seg-
ments are not copied in RAM at the application start up.
if (_fctcpy(‘b’))
flash();
Checksum Computation
This feature is activated by the detection of the symbol __ckdesc__ as
an undefined symbol. This is practically done by calling one of the pro-
vided checksum functions which uses that symbol and returns 0 if the
checksum is correct. These functions are provided in the integer library
and are the following:
You then have to update the link command file in two ways:
Here is an example of link command file showing how to use -ck and
-ik:
The linker also builds a debug symbol table based on the debug symbol
tables in any of the input object modules. It builds the debug symbol
table by concatenating the debug symbol tables of each input object
module in the order it encounters them. If debugging is not enabled for
any of input object module, the debug symbol table will be of zero
length.
The executable file created by the linker must have no REFs in its sym-
bol table. Otherwise, the linker emits the error message “undefined sym-
bol” and returns failure.
Special Topics
This section explains some special linker capabilities that may have
limited applicability for building most kinds of microcontroller applica-
tions.
Any symbols defined in <public files> are known outside this private
name region. Any symbols defined in <private libraries> are known
only within this region; hence they may safely be redefined as private to
other regions as well.
NOTE
All symbols defined in a private region are local symbols and will not
appear in the symbol table of the output file.
Renaming Symbols
At times it may be desirable to provide a symbol with an alias and to
hide the original name (i.e., to prevent its definition from being used by
the linker as a DEF which satisfies REFs to that symbol name). As an
example, suppose that the function func in the C library provided with
the compiler does not do everything that is desired of it for some special
application. There are three methods of handling this situation (we will
ignore the alternative of trying to live with the existing function’s defi-
ciencies).
The first method is to write a new version of the function that performs
as required and link it into the program being built before linking in the
libraries. This will cause the new definition of func to satisfy any refer-
ences to that function, so the linker does not include the version from
the library because it is not needed. This method has two major draw-
backs: first, a new function must be written and debugged to provide
something which basically already exists; second, the details of exactly
what the function must do and how it must do it may not be available,
thus preventing a proper implementation of the function.
The third approach is to use the aliasing capabilities of the linker. Like
the second method, a new function will be written which performs the
new behavior and then calls the old function. The twist is to give the old
function a new name and hide its old name. Then the new function is
given the old function’s name and, when it calls the old function, it uses
the new name, or alias, for that function. The following linker script
provides a specific example of this technique for the function func:
NOTE
The function name func as referenced here is the name as seen by the C
programmer. The name which is used in the linker for purposes of alias-
ing is the name as seen at the object module level. For more information
on this transformation, see the section “Interfacing C to Assembly Lan-
guage” in Chapter 3.
The main thing to note here is that func.o and new_func.o both define a
(different) function named func. The second function func defined in
newfunc.o calls the old func function by its alias oldfunc.
Name regions provide limited scope control for symbol names. The
+new command starts a new name region, which will be in effect until
the next +new command. Within a region there are public and private
name spaces. These are entered by the +pub and +pri commands; by
default, +new starts in the public name space.
Lines 1,2 are the basic linker commands for setting up a separate I/D
program. Note that there may be other options required here, either by
the system itself or by the user.
Line 4 specifies the startup code for the system being used.
Line 5 establishes the symbol _oldfunc as an alias for the symbol _func.
The symbol _oldfunc is entered in the symbol table as a public defini-
tion. The symbol _func is entered as a private reference in the current
region.
Line 6 switches to the private name space in the current region. Then
func.o is linked and provides a definition (private, of course) which sat-
isfies the reference to _func.
Line 7 starts a new name region, which is in the public name space by
default. Now no reference to the symbol _func can reach the definition
created on Line 6. That definition can only be reached now by using the
symbol _oldfunc, which is publicly defined as an alias for it.
Line 8 links the user program and the module newfunc.o, which pro-
vides a new (and public) definition of _func. In this module the old ver-
sion is accessed by its alias. This new version will satisfy all references
to _func made in prog.o and the libraries.
The rules governing which name space a symbol belongs to are as fol-
lows:
• Any new reference is associated with the region in which the ref-
erence is made. It can be satisfied by a private definition in that
region, or by a public definition. A previous definition of that
symbol will satisfy the reference if that definition is public, or if
the definition is private and the reference is made in the same
region as the definition.
application to use those symbols as externals. Note that the linker does
not produce any map even if requested, when used with the -s option.
The first link builds the application itself using the appli.lkf command
file. The second link uses the same command file and creates an object
file containing only an absolute symbol table. This file can then be used
as an input object file in any other link command file.
Modules List all the modules which compose the application, giving
for each the description of all the defined sections with the
same format as in the Segment section. If an object has
been assembled with the -pl option, local symbols are dis-
played just after the module description.
Stack Usage Describe the amount of memory needed for the stack.
Each function of the application is listed by its name, fol-
lowed by a ‘>’ character indicating that this function is not
called by any other one (the main function, interrupt func-
tions, task entries...). The first number is the total size of
Return Value
clnk returns success if no error messages are printed to STDOUT; that
is, if no undefined symbols remain and if all reads and writes succeed.
Otherwise it returns failure.
A linker command file consists of linker options, input and output file,
and libraries. The options and files are read from a command file by the
linker. For example, to create an MC68HC12 file from file.o you can
type at the system prompt:
Debugging Support
This chapter describes the debugging support available with the cross
compiler targeting the MC68HC12. There are two levels of debugging
support available, so you can use either the COSMIC’s Zap C source
level cross debugger or your own debugger or in-circuit emulator to
debug your application. This chapter includes the following sections:
2 information about the name, type, storage class and address (abso-
lute or relative to a stack offset) of program static data objects, func-
tion arguments, and automatic data objects that functions declare.
Information about what source files produced which relocatable or
executable files. This information may be localized by address
(where the output file resides in memory). It may be written to a file,
sorted by address or alphabetical order, or it may be output to a
printer in paginated or unpaginated format.
cprd may be used to extract the debugging information from files com-
piled with the +debug option, as described below.
where <file> is an object file compiled from C source with the com-
piler command line option +debug set.
Examples
The following example show sample output generated by running the
cprd utility on an object file created by compiling the program acia.c
with the compiler option +debug set.
cprd acia.h12
(no globals)
To use clst efficiently, its argument files must have been compiled with
the +debug option.
-o* redirect output from clst to file *. You can achieve a simi-
lar effect by redirecting output in the command line.
is equivalent to:
-r 0xe000:0xe200
Programming Support
This chapter describes each of the programming support utilities pack-
aged with the C cross compiler targeting the MC68HC12. The follow-
ing utilities are available:
The description of each utility tells you what tasks it can perform, the
command line options it accepts, and how you use it to perform some
commonly required operations. At the end of the chapter are a series of
examples that show you how to combine the programming support util-
ities to perform more complex operations.
Return Status
cbank returns success if no error messages are printed. Otherwise it
returns failure.
Examples
The following command:
will generate bk_list as the result file, with a page window of size
0x1000 from the given list obj_list which contains:
file1.o
file2.o
file3.o
file4.o
The first value is the space used in the bank, and the second value is the
bank size.
Bank start addresses can be included into the input file, such as:
-pp behaves as -p but uses paged addresses for all banked seg-
ments, mapped or unmapped. This option has to be selectd
when producing an hex file for Promic tools.
Return Status
chex returns success if no error messages are printed; that is, if all
records are valid and all reads and writes succeed. Otherwise it returns
failure.
Examples
The file hello.c, consisting of:
chex hello.o
S00A000068656C6C6F2E6F44
S1110000020068656C6C6F20776F726C640090
S9030000FC
clabs decodes an executable file to retrieve the list of all the files which
have been used to create the executable. For each of these files, clabs
looks for a matching listing file produced by the compiler (“.ls” file). If
such a file exists, clabs creates a new listing file (“.la” file) with abso-
lute addresses and code, extracted from the executable file.
To be able to produce any results, the compiler must have been used
with the ‘-l’ option.
-pp behaves as -p but uses paged addresses for all banked seg-
ments, mapped or unmapped.
-r* specify the input suffix, including or not the dot ‘.’ charac-
ter. Default is “.ls”
-s* specify the output suffix, including or not the dot ‘.’ char-
acter. Default is “.la”
Return Status
clabs returns success if no error messages are printed; that is, if all reads
and writes succeed. An error message is output if no relocatable listing
files are found. Otherwise it returns failure.
Examples
The following command line:
clabs -v acia.h12
will output:
crts.ls
acia.ls
vector.ls
will generate:
crts.lx
acia.lx
vector.lx
-i* take object files from a list *. You can put several files per
line or put one file per line. Each lines can include com-
ments. They must be prefixed by the ‘#’ character. If the
command line contains <files>, then <files> will be also
added to the library.
-l when a library is built with this flag set, all the modules of
the library will be loaded at link time. By default, the
linker only loads modules necessary for the application.
-v be verbose
At most one of the options -[c r t x] may be specified at the same time.
If none of these is specified, the -t option is assumed.
Return Status
clib returns success if no problems are encountered. Otherwise it
returns failure. After most failures, an error message is printed to
STDERR and the library file is not modified. Output from the -t, -s
options, and verbose remarks, are written to STDOUT.
Examples
To build a library and check its contents:
Return Status
cobj returns success if no diagnostics are produced (i.e. if all reads are
successful and all file formats are valid).
Examples
For example, to get the symbol table:
cobj -s acia.o
symbols:
The information for each symbol is: name, address, section to which it
belongs and attribute.
0 for no paging.
1 for pages with PHYSICAL ADDRESSES
2 for pages with banked addresses
<page><offset_in_page>
Return Status
cv695 returns success if no problems are encountered. Otherwise it
returns failure.
Examples
Under MS/DOS, the command could be:
Return Status
cvdwarf returns success if no problems are encountered. Otherwise it
returns failure.
Examples
Under MS/DOS, the command could be:
cvdwarfC:\test\basic.h12
cvdwarf /test/basic.h12
Compiler Error
Messages
This appendix lists the error messages that the compiler may generate in
response to errors in your program, or in response to problems in your
host system environment, such as inadequate space for temporary inter-
mediate files that the compiler creates.
The first pass of the compiler generally produces all user diagnostics.
This pass deals with # control lines and lexical analysis, and then with
everything else having to do with semantics. Only machine-dependent
extensions are diagnosed in the code generator pass. If a pass produces
diagnostics, later passes will not be run.
_asm string too long - the string constant passed to _asm is larger than
255 characters
array size unknown - the sizeof operator has been applied to an array
of unknown size
bad #else - a #else occurs without a previous #if, #ifdef, #ifndef or #elif
bad #endif - a #endif occurs without a previous #if, #ifdef, #ifndef, #elif
or #else
bad #pragma space directive - syntax for the #pragma space directive
is incorrect
bad _asm() argument type - the first argument passed to _asm is miss-
ing or is not a character string
bad structure for return - the structure for return is not compatible
with that of the function
bad void argument - the type void has not been used alone in a proto-
typed function declaration
duplicate case - two case labels have been defined with the same value
in the same switch statement
duplicate default - a default label has been specified more than once in
a switch statement
invalid case - a case label has been specified outside of a switch state-
ment
invalid address operand - the “address of” operator has been applied
to a register variable or an rvalue expression
invalid address type - the “address of” operator has been applied to a
bitfield
invalid bitfield size - a bitfield has been declared with a size larger than
its type size
invalid bitfield type - a type other than int, unsigned int, char,
unsigned char has been used in a bitfield.
invalid break - a break may be used only in while, for, do, or switch
statements
invalid cast type - a cast has been applied to an object that cannot be
coerced to a specific type
invalid function type - the function call operator () has been applied to
an object which is not a function or a pointer to a function
invalid sizeof operand type - the sizeof operator has been applied to a
function
missing _asm() argument - the _asm function needs at least one argu-
ment
missing local name - a local variable has been declared without a name
repeated type specification - the same type modifier occurs more than
once in a type specification
too many spaces modifiers - too many different names for ‘@’ modifi-
ers are used
bad @interrupt usage - the @interrupt type modifier can only be used
on functions.
redefined space - the version of cp6812 you used to compile your pro-
gram is incompatible with cg6812.
All other PANIC ! messages should never happen. If you get such a
message, please report it with the corresponding source program to
COSMIC.
bad else - an else directive has been found without a previous if direc-
tive
bad file name - the include directive operand is not a character string
bad string constant - a character constant does not end with a single or
double quote
can't create <name> - the file <name> cannot be opened for writing
can't open <name> - the file <name> cannot be opened for reading
section name <name> too long - a section name has more than 15
characters
string constant too long - a string constant is longer than 255 charac-
ters
symbol <name> not defined - a symbol has been used but not declared
too many arguments - a macro has been invoked with more than 9
arguments
value too large - an operand is too large for the instruction type
bad file format - an input file has not an object file format.
bad number in +def - the number provided in a +def directive does not
follow the standard C syntax.
bad processor type - an object file has not the same configuration
information than the others.
bad section name in +def - the name specified after the ‘@’ in a +def
directive is not the name of a segment.
can't locate shared segment - shared datas have been found but no
host segment has been specified.
file already linked - an input file has already been processed by the
linker.
missing '=' in +spc <segment> - the +spc directive syntax is not cor-
rect.
shared segment not empty - the host segment for shared data is not
empty and cannot be used for allocation.
Modifying Compiler
Operation
This chapter tells you how to modify compiler operation by making
changes to the standard configuration file. It also explains how to create
your own “programmable options” which you can use to modify com-
piler operation from the cx6812.cxf.
cx6812 hello.c
name:popt,gopt,oopt,aopt,exclude...
The first field defines the option name and must be ended by a colon
character ‘:’. The four next fields describe the effect of this option on
the four passes of the compiler, respectively the parser, the generator,
the optimizer and the assembler. These fields are separated by a comma
character ‘,’. If no specific option is needed on a pass, the field has to be
specified empty. The remaining fields, if specified, describe a exclusive
relationship with other defined options. If two exclusive options are
specified on the command line, the compiler will stop with an error
message. You may define up to 20 programmable options. At least one
field has to be specified. Empty fields need to be specified only if a use-
ful field has to be entered after.
the two options dl1 and dl2 are defined. If the option +dl1 is specified
on the compiler command line, the specific option -l will be used for the
parser and the specific option -dl1 will be used for the code generator.
No specific option will be used for the optimizer and for the assembler.
The option dl1 is also declared to be exclusive with the option dl2,
meaning that dl1 and dl2 will not be allowed together on the compiler
command line. The option dl2 is defined in the same way.
Example
The following command line
MC68HC12 Machine
Library
This appendix describes each of the functions in the Machine Library
(libm). These functions provide the interface between the MC68HC12
microcontroller hardware and the functions required by the code gener-
ator. They are described in reference form, and listed alphabetically.
• integer in D register.
• far pointer in a register pair whose low word (offset) is the X reg-
ister and whose high word is the D register, the page number in A
register, B register beeing always zero.
In the functions description below, left and right refer to left and right
operands, or first and second operands, of library functions.
c_bfget
Description
Get a long bitfield
Syntax
; raw value in long register
jsr c_bfget
dc.l mask
; result in long register
Function
c_bfget is extracting a long bitfield from the value loaded in the long
register using the mask specified in the program memory just after the
jsr instruction.
Returns
The resulting value is in long register.
See Also
c_bfput
c_bfput
Description
Store a long bitfield
Syntax
; value in long register
; pointer to bitfield in y register
jsr c_bfput
dc.l mask
; result in long register
Function
c_bfput is storing a long bitfield at the address loaded in the Y register
by shifting and masking the long register from a mask specified in the
program memory just after the jsr instruction.
Returns
Nothing.
See Also
c_bfget
c_check
Description
Check stack growth
Syntax
leay #<size>,s
jsr c_check
Function
c_check is used to check that the stack pointer is not overwriting valid
data in memory. Users must write their own check functions, because
the memory map is application-dependent. The value in Y is the new
stack pointer value.
Returns
c_check returns only if the stack pointer is correct. Otherwise, the
behavior is user-dependent. c_check is called when the -ck flag is spec-
ified (raised) to the code generator (cg6812). This option produces
larger and slower code. It should only be used for test and debugging.
The libraries provided with the compiler include a version of c_check
that always returns. It may be used as a template for user-written ver-
sions of this function.
c_dadd
Description
Add double to double
Syntax
; pointer to left in x register
; pointer to right in y register
jsr c_dadd
; result in left
Function
c_dadd adds the double in left to the double in right. No check is made
for overflow.
Returns
The resulting value is in left. Flags have no meaningful value upon
return.
See Also
c_dsub
c_dcmp
Description
Compare double with double
Syntax
; pointer to left in x register
; pointer to right in y register
jsr c_dcmp
; result in flags
Function
c_dcmp compares the double in left with the double in right.
Returns
The N and Z flags are set to reflect the value of (left-right).
c_ddiv
Description
Divide double by double
Syntax
; pointer to left in x register
; pointer to right in y register
jsr c_ddiv
; result in left
Function
c_ddiv divides the double in left by the double in right.
Returns
The resulting value is in left. A zero divide leaves the operand
unchanged. Flags have no meaningful value upon return.
c_dmul
Description
Multiply double by double
Syntax
; pointer to left in x register
; pointer to right in y register
jsr c_dmul
; result in left
Function
c_dmul multiplies the double in left by the double in right.
Returns
The resulting value is in left. Flags have no meaningful value upon
return.
c_dneg
Description
Negate a double
Syntax
; pointer to operand in y register
jsr c_dneg
; result in operand
Function
c_dneg negates the double pointed at by the Y register.
Returns
The result stays in operand. The flags are not significant on return.
c_dsmov
Description
Move a structure in DPAGE space
Syntax
; source address on the stack
; destination address in X:D
ldy #<size>
jsr c_dsmov
Function
c_dsmov moves a structure inside the DPAGE data space. Both source
and destination addresses are far pointer, pointer to source is on the
stack, and pointer to destination is in the register pair X:D. The struc-
ture size is in the Y register.
See Also
c_esmov
c_dsub
Description
Subtract double from double
Syntax
; pointer to left in x register
; pointer to right in y register
jsr c_dsub
; result in left
Function
c_dsub subtracts the double in right from the double in left. No check is
made for overflow.
Returns
The resulting value is in left. Flags have no meaningful value upon
return.
See Also
c_dadd
c_dtod
Description
Copy a double into a double
Syntax
; pointer to left in x register
; pointer to right in y register
jsr c_dtod
; result in left
Function
c_dtod copies the double in right to left.
Returns
The right value is in left. Flags have no meaningful value upon return.
c_dtof
Description
Convert double to float
Syntax
; pointer to double in y register
jsr c_dtof
; result in float register
Function
c_dtof converts the double pointed at by Y to a float in the float register.
No check is made for overflow.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
c_dtoi
Description
Convert double to integer
Syntax
; pointer to operand in y register
jsr c_dtoi
; result in d
Function
c_dtoi converts the double pointed at by Y to a two byte integer in D.
No check is made for overflow.
Returns
The resulting value is in D and flags are set accordingly.
c_dtol
Description
Convert double into long integer
Syntax
; pointer to double in y register
jsr c_dtol
; result in long register
Function
c_dtol converts the double in memory pointed at by Y to a long in the
long register. No check is made for overflow.
Returns
The resulting value is in the long register.
c_dtos
Description
Copy a double onto the stack
Syntax
; pointer to double in y register
jsr c_dtos
Function
c_dtos copies the double pointed to by Y onto the stack.
Returns
c_dtos returns nothing; the stack is updated.
c_eewbfb
Description
Eeprom char bit field update
Syntax
ldb #value
ldy #address
jsr c_eewbfb
dc.b <mask>
Function
c_eewbfb updates a char bit field (8 bits sized) located ineeprom with a
new value. The new value is in B and is right justified. The byte address
in eeprom is in Y, and the mask, giving the bit field size and location, is
a byte located in memory just after the call. The function waits for the
time necessary to program the new value.
See Also
c_eewbfd, c_eewbfx, c_eewstx, c_eewsty
c_eewbfd
Description
Eeprom short bit field update
Syntax
ldd #value
ldy #address
jsr c_eewbfd
dc.w <mask>
Function
c_eewbfd updates a short bit field (16 bits sized) located in eeprom
with a new value. The new value is in D and is right justified. The word
address in eeprom is in Y, and the mask, giving the bit field size and
location, is a word located in memory just after the call. The function
waits as required to program the new value.
See Also
c_eewbfb, c_eewbfx, c_eewstx, c_eewsty
c_eewbfx
Description
Eeprom long bit field update
Syntax
; value in long register
ldy #address
jsr c_eewbfx
dc.w <mask>
Function
c_eewbfx updates a long bit field (32 bits sized) located in eeprom with
a new value. The new value is in X:D and is right justified. The long
address in eeprom is in Y, and the mask, giving the bit field size and
location, is a word located in memory just after the call. The function
waits as required to program the new value.
See Also
c_eewbfb, c_eewbfd, c_eewstx, c_eewsty
c_eewra
Description
Write a short int aligned in eeprom
Syntax
ldd #value
ldy #address
jsr c_eewra
Function
c_eewra writes a short int in eeprom. The new value is in D, and its
address in eeprom is in Y, and is assumed to be even allowing the full
word to be programmed with one single cycle.
See Also
c_eewrc, c_eewrd, c_eewrl, c_eewrw
c_eewrc
Description
Write a char int in eeprom
Syntax
ldb #value
ldy #address
jsr c_eewrc
Function
c_eewrc writes a byte in eeprom. The new byte value is in B and its
address in eeprom is in Y. The function tests if the erasure is necessary,
and it performs only in that case. Then if the new value is different from
the one in eeprom, the new byte is programmed. The function waits for
the time necessary to correctly program the byte. The delay function
included in this module assumes that the clock frequency is 8 Mhz. The
function does not test if the byte address is in the address range corre-
sponding to the existing eeprom.
See Also
c_eewra, c_eewrd, c_eewrl, c_eewrw
c_eewrd
Description
Write a double in eeprom
Syntax
; pointer to destination in x register
; pointer to source in y register
jsr c_eewrd
Function
c_eewrd writes a double in eeprom. If the destination address is even,
all words are programmed by the c_eewra function. Otherwise, the first
and last bytes are programmed by the c_eewrc function, and the middle
words are programmed by the c_eewra function. The function waits as
required to program all the bytes.
See Also
c_eewra, c_eewrc, c_eewrl, c_eewrw
c_eewrl
Description
Write a long int in eeprom
Syntax
; value in long register
ldy #address
jsr c_eewrl
Function
c_eewrl writes a long int in eeprom. The new value is in the long regis-
ter, and its address in eeprom is in Y. If the destination is even, each
word is written by the c_eewra function. Otherwise, the first and last
bytes are programmed independently by the c_eewrc function, and the
middle word is programmed by the c_eewra function. The function
waits as required to program all the bytes.
See Also
c_eewra, c_eewrc, c_eewrd, c_eewrw
c_eewrw
Description
Write a short int in eeprom
Syntax
ldd #value
ldy #address
jsr c_eewrw
Function
c_eewrw writes a short int in eeprom. The new value is in D, and its
address in eeprom is in Y. If the destination address is even, the word is
programmed directly by a single programming cycle. Otherwise, each
byte is programmed independently by the c_eewrc function.
See Also
c_eewra, c_eewrc, c_eewrd, c_eewrl
c_eewstx
Description
Move a structure in eeprom
Syntax
ldy #source_address
ldx #destination_address
ldd #<size>
jsr c_eewstx
Function
c_eewstx moves a structure into an eeprom memory location.Pointer to
source is in Y, and pointer to destination is in X. The structure size is
given by a word located in the D register. Depending on the size and the
destination address alignment, as many words as possible are pro-
grammed by the c_eewra function. Remainning bytes are programmed
by the c_eewrc function.
See Also
c_eewbfb, c_eewbfd, c_eewbfx, c_eewra, c_eewrc, c_eewsty
c_eewsty
Description
Move a structure in eeprom
Syntax
ldx #source_address
ldy #destination_address
ldd #<size>
jsr c_eewsty
Function
c_eewsty moves a structure into an eeprom memory location.Pointer to
source is in X, and pointer to destination is in Y. The structure size is
given by a word located in the D register. Depending on the size and the
destination address alignment, as many words as possible are pro-
grammed by the c_eewra function. Remainning bytes are programmed
by the c_eewrc function.
See Also
c_eewbfb, c_eewbfd, c_eewbfx, c_eewra, c_eewrc, c_eewstx
c_emuld
Description
Multiply signed int by unsigned int
Syntax
; signed int in d register
; unsigned int in y register
jsr c_emuld
; long result in y:d register pair
Function
c_emuld multiplies the signed int value in the D register by the
unsigned int value in the Y register. The 32 bits result is stored in the
register pair Y:D.
See Also
c_emuly
c_emuly
Description
Multiply unsigned int by signed int
Syntax
; unsigned int in d register
; signed int in y register
jsr c_emuly
; long result in y:d register pair
Function
c_emuly multiplies the unsigned int value in the D register by the
signed int value in the Y register. The 32 bits result is stored in the reg-
ister pair Y:D.
See Also
c_emuld
c_esmov
Description
Move a structure in EPAGE space
Syntax
; source address on the stack
; destination address in x:d
ldy #<size>
jsr c_esmov
Function
c_esmov moves a structure inside the EPAGE data space. Both source
and destination addresses are far pointer, pointer to source is on the
stack, and pointer to destination is in the register pair X:D. The struc-
ture size is in the Y register.
See Also
c_dsmov
c_fadd
Description
Add float to float
Syntax
; left in float register
; pointer to right in y register
jsr c_fadd
; result in float register
Function
c_fadd adds the float in float register to the float indicated by the
pointer in Y. No check is made for overflow.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
See Also
c_fsub
c_fcmp
Description
Compare floats
Syntax
; left in float register
; pointer to right in y register
jsr c_fcmp
; result in flags
Function
c_fcmp compares the float in the float register with the float pointed at
by the Y register.
Returns
The N and Z flags are set to reflect the value (left-right).
c_fdiv
Description
Divide float by float
Syntax
; left in float register
; pointer to right in y register
jsr c_fdiv
; result in float register
Function
c_fdiv divides the float in the float register by the float pointed to by the
Y register.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
c_fgadd
Description
Float addition
Syntax
; pointer to left in y register
; right in float register
jsr c_lgadd
; result in left
Function
c_fgadd performs the float addition of the value pointed at by Y and the
value in the float register.
Returns
The result is stored at the location pointed at by the Y register.
c_fgdiv
Description
Float division
Syntax
; pointer to left in y register
; right in float register
jsr c_fgdiv
; result in left
Function
c_fgdiv performs the float division of the value pointed at by the Y reg-
ister by the value in float register.
Returns
The result is stored in the location pointed at by Y.
c_fgmul
Description
Float multiplication
Syntax
; pointer to left in y register
; right in float register
jsr c_fgmul
; result in left
Function
c_fgmul performs the float multiplication of the value pointed at by the
Y register by the value in float register.
Returns
The result is stored in the location pointed at by Y.
c_fgsub
Description
Float subtraction
Syntax
; pointer to left in y register
; right operand in float register
jsr c_fgsub
; result in left
Function
c_fgsub evaluates the (float) difference between the value pointed at by
the Y register and the value in float register
Returns
The result is stored in the location pointed at by Y.
c_fmul
Description
Multiply float by float
Syntax
; left in float register
; pointer to right in y register
jsr c_fmul
; result in float register
Function
c_fmul multiplies the float in the float register by the float pointed to by
the Y register.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
c_fsub
Description
Subtract float from float
Syntax
; left in float register
; pointer to right in y register
jsr c_fsub
; result in float register
Function
c_fsub subtracts the float pointed to by the Y register from the float in
the float register. No check is made for overflow.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
See Also
c_fadd
c_ftod
Description
Convert float into double
Syntax
; pointer to double in y register
; float in float register
jsr c_ftod
; result in memory
Function
c_ftod converts the float in the float register to a double in the memory
pointed at by Y.
Returns
The resulting value is in memory at the location pointedt by the Y regis-
ter. Flags have no meaningful value upon return.
c_ftoi
Description
Convert float to integer
Syntax
; float in float register
jsr c_ftoi
; result in d
Function
c_ftoi converts the float in the float register to a two byte integer in D.
No check is made for overflow.
Returns
The resulting value is in d. Flags have no meaningful value upon return.
c_ftol
Description
Convert float into long integer
Syntax
; float in float register
jsr c_ftol
; result in long register
Function
c_ftol converts the float in the float register to a four byte integer in
long register. No check is made for overflow.
Returns
The resulting value is in the long register. Flags have no meaningful
value upon return.
c_itod
Description
Convert integer into double
Syntax
; pointer to double in y register
ldd value
jsr c_itod
; result in memory
Function
c_itod converts the two byte integer in D to a double stored in memory
at the address specified by the Y register.
Returns
The resulting value is in memory at the address specified by the Y reg-
ister. Flags have no meaningful value upon return.
c_itof
Description
Convert integer into float
Syntax
ldd value
jsr c_itof
; result in float register
Function
c_itof converts the two byte integer in D to a float stored in the float
register.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
c_jltab
Description
Perform C switch statement on long
Syntax
; <value> in long register
ldy #swtab
jsr c_jltab
Function
c_jltab is called to switch to the proper code sequence, depending on a
value and an address table. The top of the table is specified in the Y reg-
ister, and consists of a list of ranges followed by a list of pairs. A range
consists of a header, made of a count followed by a starting value, fol-
lowed by an address list. A header with a zero count indicates the final
list of pairs. The count is followed in this case by the number of follow-
ing pairs. A pair consists of an address followed by a value. The pair list
is ended by the default address. All values are four byte integers. All
addresses are two byte integers.
Returns
c_jltab jumps to the proper code. It never returns.
c_jptab
Description
Perform C switch statement in PIC mode
Syntax
ldd value
jsr c_jptab,pcr
<offsets>
Function
c_jptab is called to switch to the proper code sequence, depending on a
value and an offset table. The top of the table is found on the stack after
the function is entered, and consists of a list of offsets allowing the
functions to compute the physical target address.
Returns
c_jptab jumps to the proper code. It never returns.
c_jtab
Description
Perform C switch statement
Syntax
ldd value
ldy #swtab
jsr c_jtab
Function
c_jtab is called to switch to the proper code sequence, depending on a
value and an address table. The top of the table is specified in the Y reg-
ister, and consists of a list of ranges followed by a list of pairs. A range
consists of a header, made of a count followed by a starting value, fol-
lowed by an address list. A header with a zero count indicates the final
list of pairs. The count is followed in this case by the number of follow-
ing pairs. A pair consists of an address followed by a value. The pair list
is ended by the default address. All values and addresses are two byte
integers.
Returns
c_jtab jumps to the proper code. It never returns.
c_ladd
Description
Long integer addition
Syntax
; left in long register
; pointer to right in y register
jsr c_ladd
; result in long register
Function
c_ladd adds the four byte integer, left and the four byte integer, right.
Returns
The result is in left. Flags are not significant on return.
See Also
c_lcmp, c_lsub
c_land
Description
Bitwise AND for long integers
Syntax
; left in long register
; pointer to right in y register
jsr c_land
; result in long register
Function
c_land operates a bitwise AND between the operands. Each operand is
taken to be a four byte integer.
Returns
The result is in the long register. Flags are not significant on return.
See Also
c_lor, c_lxor
c_lcmp
Description
Long integer compare
Syntax
; left in long register
; pointer to right in y register
jsr c_lcmp
; result in flags
Function
c_lcmp compares the four byte integer, left with the four byte integer
pointed at by Y.
Returns
Flags are set accordingly.
See Also
c_ladd, c_lsub, c_pcmp
c_ldiv
Description
Quotient of long integer division
Syntax
; left in long register
; pointer to right in y register
jsr c_ldiv
; quotient in long register
Function
c_ldiv divides the four byte integer in the long register by the four byte
integer pointed at by Y. Values are assumed to be signed. If division by
zero is attempted, results are as provided by the divide instruction.
Return
The quotient is in the long register; The flags are not significant on
return.
See Also
c_ludv, c_lmod, c_umd
c_lgadd
Description
Long addition
Syntax
; pointer to left in y register
; right in long register
jsr c_lgadd
; result in left
Function
c_lgadd performs the long addition of the value pointed at by Y and the
value in the long register.
Returns
The result is stored at the location pointed at by the Y register.
c_lgand
Description
Long bitwise AND
Syntax
; pointer to left in y register
; right in long register
jsr c_lgand
; result in memory (left is updated)
Function
c_lgand performs the long bitwise AND of the value pointed at by the
Y register and the value in the long register.
Returns
The results is stored at the location pointed at by the Y register, mean-
ing that the left operand is updated.
c_lgdiv
Description
Quotient of long division
Syntax
; pointer to left in y register
; right in long register
jsr c_lgdiv
; result in left
Function
c_lgdiv performs the long division of the value pointed at by the Y reg-
ister by the value in long register.
Returns
The result is stored in the location pointed at by Y.
c_lglsh
Description
Long shift left
Syntax
; pointer to long in y register
; shift count in d register
jsr c_lglsh
; result in memory
Function
c_lglsh performs the long left shift of the value pointed at by the Y reg-
ister, by the bit count in D. No check is done against silly counts.
Returns
The result is stored in the location pointed at by Y.
c_lgmod
Description
Remainder of long division
Syntax
; pointer to left in y register
; right in long register
jsr c_lgmod
; result in left
Function
c_lgmod performs the long division of the value pointed at by the Y
register by the value in long register and stores the remainder.
Returns
The result is stored in the location pointed at by Y.
c_lgmul
Description
Long multiplication
Syntax
; pointer to left in y register
; right in long register
jsr c_lgmul
; result in left
Function
c_lgmul performs the long multiplication of the value pointed at by the
Y register by the value in long register.
Returns
The result is stored in the location pointed at by Y.
c_lgor
Description
Long bitwise OR
Syntax
; pointer to left in y register
; right operand in long register
jsr c_lgor
; result in left
Function
c_lgor performs the long bitwise OR of the value pointed at by Y and
the value in the long register.
c_lgrsh
Description
Signed long shift right
Syntax
; pointer to long in y register
; shift count in d register
jsr c_lgrsh
; result in memory
Function
c_lgrsh performs the signed long right shift of the value pointed at by
the Y register, by the bit count in the D register. No check is done
against silly counts. Because the value is signed, arithmetic shift
instructions are used.
Returns
The result is stored in the location pointed at by y.
c_lgudv
Description
Quotient of unsigned long division
Syntax
; pointer to left in y register
; right in long register
jsr c_lgudv
; result in left
Function
c_lgudv performs the unsigned long division of the value pointed at by
the Y register by the value in long register.
Returns
The result is stored in the location pointed at by Y.
c_lgumd
Description
Remainder of unsigned long division
Syntax
; pointer to left in y register
; right in long register
jsr c_lgumd
; result in left
Function
c_lgumd performs the unsigned long division of the value pointed at by
the Y register by the value in long register and stores the remainder.
Returns
The result is stored in the location pointed at by Y.
c_lgursh
Description
Unsigned long shift right
Syntax
; pointer to long in y register
; shift count in d register
jsr c_lgursh
; result in memory
Function
c_lgursh performs the unsigned long right shift of the value pointed at
by the Y register, by the bit count in the D register. No check is done
against silly counts. Because the value is unsigned, logical shift instruc-
tions are used.
Returns
The result is stored in the location pointed at by Y.
c_lgsub
Description
Long subtraction
Syntax
; pointer to left in y register
; right operand in long register
jsr c_lgsub
; result in left
Function
c_lgsub evaluates the (long) difference between the value pointed at by
the Y register and the value in long register
Returns
The result is stored in the location pointed at by Y.
c_lgxor
Description
Long bitwise exclusive OR
Syntax
; pointer to left in y register
; right operand in long register
jsr c_lgxor
; result in left
Function
c_lgxor performs the long bitwise EXOR (exclusive OR) of the value
pointed at by the Y register and the value in long register.
Returns
The result is stored in the location pointed at by Y.
c_llsh
Description
Long shift left
Syntax
; operand in long register
; shift count in y register
jsr c_llsh
; result in long register
Function
c_llsh performs the long left shift of the value in the long register, by
the bit count in Y. No check is done against silly counts.
Returns
The result is in the long register.
c_lmod
Description
Remainder of long integer division
Syntax
; left in long register
; pointer to right in y register
jsr c_lmod
; remainder in long register
Function
c_lmod divides the four byte integer in long register by the four byte
integer pointed at by the Y register. Values are assumed to be signed.
The dividend is returned in the case of a division by zero.
Returns
The remainder appears in the long register.
See Also
c_lumd, c_ldiv, c_udiv
c_lmul
Description
Multiply long integer by long integer
Syntax
; left in long register
; pointer to right in y register
jsr c_lmul
; result in long register
Function
c_lmul multiplies the four byte integer in the long register by the four
byte integer pointed at by the Y register. No check is made for overflow.
Returns
The resulting value is in the long register.
c_lneg
Description
Negate a long integer
Syntax
; value in long register
jsr c_lneg
; result in long register
Function
c_lneg negates the four byte integer in the long register.
Returns
The result stays in the long register. The flags are not significant on
return.
See Also
c_lcom
c_lor
Description
Bitwise OR with long integers
Syntax
; left in long register
; pointer to right in y register
jsr c_lor
; result in long register
Function
c_lor operates a bitwise OR between the contents of the long register
and the long pointed at by the Y register. Each operand is taken to be a
four byte integer.
Returns
The result is in the long register. The flags are not significant on return.
See Also
c_land, c_lxor
c_lrsh
Description
Signed long shift right
Syntax
; operand in long register
; shift count in y register
jsr c_lrsh
; result in long register
Function
c_lrsh performs the signed long right shift of the value in the long regis-
ter, by the bit count in the Y register. No check is done against silly
counts. Because the value is signed, arithmetic shift instructions are
used.
Returns
The result is in the long register.
c_lrzmp
Description
Long test against zero
Syntax
; value in long register
jsr c_lrzmp
; result in the flags
Function
c_lrzmp tests the value in the long register and updates the sign and zero
flags.
Returns
Nothing, but the (possibly changed) flags.
c_lsub
Description
Long integer subtraction
Syntax
; long in long register
; pointer to right in y register
jsr c_lsub
; result in long register
Function
c_lsub subtracts the four byte integer pointed at by the Y register from
the four byte integer in the long register.
Returns
The result is in the long register. Flags are not significant on return.
See Also
c_ladd, c_lcmp
c_ltod
Description
Convert long integer into double
Syntax
; pointer to double in y register
; long in long register
jsr c_ltod
; result in memory
Function
c_ltod converts the four byte integer in the long register to a double
pointed at by the Y register.
Returns
The resulting value is in memory. Flags have no meaningful value upon
return.
c_ltof
Description
Convert long integer into float
Syntax
; value in long register
jsr c_ltof
; result in float register
Function
c_ltof converts the four byte integer in the long register to a float.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
c_ludv
Description
Quotient of unsigned long integer division
Syntax
; left in long register
; pointer to right in y register
jsr c_lduv
; quotient in long register
Function
c_ludv divides the four byte integer in the long register by the four byte
integer pointed at by the Y register. Values are assumed to be unsigned.
The dividend is returned in the case of a division by zero.
Returns
The quotient is in the long register. The flags are not significant on
return.
See Also
c_ldiv, c_lmod, c_lumd
c_lumd
Description
Remainder of unsigned long integer division
Syntax
; left in long register
; pointer to right in y register
jsr c_lumd
; remainder in long register
Function
c_lumd divides the four byte integer in the long register by the four byte
integer pointed at by the Y register. Values are assumed to be unsigned.
The dividend is returned in the case of a division by zero.
Returns
The remainder is in the long register. The flags are not significant on
return.
See Also
c_lmod, c_ldiv, c_ludv
c_lursh
Description
Unsigned long shift right
Syntax
; operand in long register
; shift count in y register
jsr c_lursh
; result in long register
Function
c_lursh performs the unsigned long right shift of the value in the long
register, by the bit count in the Y register. No check is done against silly
counts. Because the value is unsigned, logical shift instructions are
used.
Returns
The result is in the long register.
c_lxor
Description
Bitwise exclusive OR with long integers
Syntax
; left in long register
; pointer to right in y register
jsr c_lxor
; result in long result
Function
c_lxor operates a bitwise exclusive OR between the contents of the long
register and the long pointed at by the Y register. Each operand is taken
to be a four byte integer.
Returns
The result is in the long register. The flags are not significant on return.
See Also
c_land, c_lor
c_lzmp
Description
Compare a long integer to zero
Syntax
; value in long register
jsr c_lzmp
; result in the flags
Function
c_lzmp compares the four byte integer in the long register with zero.
Returns
Nothing. The Z flags is updated.
c_pcmp
Description
Far pointer compare
Syntax
; left in far pointer register
; pointer to right in y register
jsr c_pcmd
; result in flags
Function
c_pcmp compares the three byte pointer, left with the three byte pointer
pointed at by Y.
Returns
Flags are set accordingly.
See Also
c_lcmp
c_uitod
Description
Convert unsigned integer into double
Syntax
; pointer to double in y register
ldd value
jsr c_uitod
; result in memory
Function
c_uitod converts the two byte unsigned integer in D to a double stored
in memory, and pointed at by the Y register.
Returns
The resulting value is in memory at the address specified by the Y reg-
ister. Flags have no meaningful value upon return.
c_uitof
Description
Convert unsigned integer into float
Syntax
ldd value
jsr c_uitof
; result in float register
Function
c_uitof converts the two byte unsigned integer in D to a float stored in
the float register.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
c_ultod
Description
Convert unsigned long integer into double
Syntax
; pointer to double in y register
; long in long register
jsr c_ultod
; result in memory
Function
c_ultod converts the four byte unsigned integer in the long register to a
double pointed at by the Y register.
Returns
The resulting value is in memory. Flags have no meaningful value upon
return.
c_ultof
Description
Convert unsigned long integer into float
Syntax
; value in long register
jsr c_ultof
; result in float register
Function
c_ultof converts the four byte unsigned integer in the long register to a
float.
Returns
The resulting value is in the float register. Flags have no meaningful
value upon return.
Compiler Passes
The information contained in this appendix is of interest to those users
who want to modify the default operation of the cross compiler by
changing the configuration file that the cx6812 compiler uses to control
the compilation process.
+e* log errors in the text file * instead of displaying the mes-
sages on the terminal screen.
-h*> include files before to start the compiler process. You can
specify up to 60 files.
0x10 @tiny
0x20 @near
0x30 @far
0x02 @pack
0x04 @nostack
Note that all the combinations are not significant for all the
target processors.
-o* write the output to the file *. Default is STDOUT for out-
put if -e is specified. Otherwise, an output file name is
required.
-rb reverse the bitfield fill order. By default, bitfields are filled
from less significant bit (LSB) to most significant bit
(MSB). If this option is specified, filling works from most
significant bit to less significant bit.
-xd add debug information in the object file only for data
objects, hiding any function.
-xx add debug information in the object file for any label
defining code or data.
Return Status
cp6812 returns success if it produces no error diagnostics.
Example
cp6812 is usually invoked before cg6812 the code generator, as in:
-cs split the const section into two sections. One for single
byte constants and another for the rest so that can be allo-
cated separately to avoid odd accesses.
-df do not use the .fdata section for @far variables, using
instead the same allocation mechanism as plain data.
+e* log errors in the text file * instead of displaying the mes-
sages on the terminal screen.
-na do not produce an xdef directive for the equate names cre-
ated for each C object declared with an absolute address.
-o* write the output to the file * and write error messages to
STDOUT. The default is STDOUT for output and
STDERR for error messages.
-r# define the I/O registers base address to allow the code gen-
erator to access the DPAGE and EPAGE registers
directly. The compiler locates those registers in page 0 by
default.
Return Status
cg6812 returns success if it produces no diagnostics.
Example
cg6812 usually follows cp6812 as follows:
-o* write the output to the file * and write error messages to
STDOUT. The default is STDOUT for output and
STDERR for error messages.
Disabling Optimization
When using the optimizer with the -c option, lines which are changed or
removed are kept in the assembly source as comment, followed by a
code composed with a letter and a digit, identifying the internal func-
tion which performs the optimization. If an optimization appears to do
something wrong, it is possible to disable selectively that function by
specifying its code with the -d option. Several functions can be disabled
by specifying a list of codes without any whitespaces. The code letter
can be enter both lower or uppercase.
Return Status
co6812 returns success if it produces no diagnostics.
Example
co6812 is usually invoked after cg6812 as follows:
Index 1
_BASE symbol 43 alphanumeric characters 110
_checksum function 90 amount of memory 306
_checksum16 function 92 ANSI checking 447
_checksum16x function 93 Arccosine 81
_checksumx function 91 Arcsine 82
_fctcpy function 103 Arctangent 83
_sbreak function 57 Arctangent of y/x 84
argument widening 182
Numerics asin function 82
32 bits, float 445 assembler 9, 451
68HC12A4 processor 51 assembler listing file 193
68HC12DP256 eeprom 39 assembler listing, process 323
8-bit precision,operation 11 assembly code, inline 45
assembly language optimizer 8
A atan function 83
abort function 79 atan2 function 84
abs function 80 atof function 85
absolute address 310 atoi function 86
absolute address,declaration 449 atol function 87
absolute addresses 42 automatic bank fill 50
absolute hex file generator 9 automatic bank filling 318
absolute listing file 323 automatic data 312
absolute listing utility 10 automatic data initialization 31 , 296
absolute path name 447 automatic filling, activated 294
absolute section 192 , 250, 259, 288 average 190
absolute symbol 282
absolute symbol table 279 B
absolute symbol tables 305 bank filling 9, 318
absolute symbol,flagged 305 bank number 49
absolute value 80 , 102, 121 bank overflow, checking 294
accumulate 120 bank segment, automatic creation 282
acos function 81 bank size 294, 318
addressing mode 197 bank size, setting 280
alias 302 bank size, specification 294
aliases, define 286 bank switched system 288
align directive 210 bank switching 48
align object 70 bank switching support 12
aligned constants 40 bank, automatic filling 294
allocate new 149 banked addresses 331
allocate on heap 127 banked segments, build 294
alphabetic character 111 base directive 211
alphabetic string 111 bias setting 289
2 Index
bias,parameter 288 -ck option,checksum 299
bitfield filling order 71 clabs utility 323
bitfield, filling 446 clib utillity 326
block inside a function 44 clist directive 213, 228, 230 , 231, 232,
block outside a function 44 233 , 234, 235, 236, 237, 238
boolean functions optimizing 41 clst utility 314
boundary 282 cobj utility 328
boundary,even 444 code generation options specification 68
branch shortening 208 code generator 8
bsct directive 212 code generator pass of the compiler 448
bss section 32 code optimization 451
bss segment, start address 283 code optimizer pass of the compiler 451
buffer to double 85, 175 code/data, no output 280
buffer to long 176 coercion 128, 135
buffer to unsigned long 177 collect into buffer 117
buffers 130 combination of options 357
build and maintain object module libraries command line options 66
10 common log 125
compare for lexical order 164 , 169
C compare two for lexical order 130
C identifier 110 compilation model,selected 331
C interface to assembly language 53 compiler architecture 3
C library 138 compiler driver 4
C library functions 74 compiler driver default behavior 66
C library package 74 compiler invocation 65
C preprocessor and language parser 8 compiler name 66
C source lines,merging 449 compiler optimizations 11
C style directives 209 compiler options 66
call instruction 51 compute 101, 105 , 124, 137, 156, 157,
calling environment 126 , 154 159 , 178
calloc function 88 concatenate 162, 168
cbank utility 318 conditional branch range 208
ceil function 89 conditional directive 205
character 129, 143, 163 , 172 configuration file 355
character copy 108 configuration file specification 68
character in set 171 configuration file, predefined options 69
characters 171 const 34
characters in buffer 129 const section splitting 69
characters in string 163 constant aligned 69
check object size 328 constant in the .text section 449
checksum functions 298 control character 112
chex utility 320 control characters 112
Index 3
conversion specifications 138 default action of compiler 66
convert 85 , 113, 175, 176, 177 default configuration file 68
convert buffer to integer 86 default placement 290
convert buffer to long 87 default sections 39
convert to 115, 119 definable group 285
convert to lowercase 180 define default compiler options 356
convert to uppercase 181 definition 48, 273, 300
copy 97, 144 DEFs 300
copy from one buffer to another 131, 133 delete character 112
copy n length 170 delete file from library 326
cos function 94 descriptor address 297
cosh function 95 descriptor format 296
cosine 94 descriptor, host 281
cprd utility 312 descriptor,data init 296
crc,checksum 299 designated segment,size 287
create library 326 disable optimization 452
cross reference 19 div function 96
cross-reference 196 divide 96, 123
cross-reference information 193 dlist directive 216
curly braces 40 double 107, 122
current segment, follow 280 double precision library 291
cv695 utility 330 double type 62
cvdwarf utility 333 DP256 Eeprom Library 292
DPAGE area 51
D DPAGE register 51
data bank 12 DPAGE registesr access 450
data initialization 32 ds directive 217
data objects, scope 310 -ds10 option, EPAGE 52
data objects, type 310 -ds12 option, DPAGE 52
data range extension 51
data segment, start address 283 E
dc directive 214 eepcpy function 97
dcb directive 215 eepera function 98
debug information 69 eeprom buffer 97
debug information,adding 447 eeprom location 38
debug symbol table 300 , 310 eepset function 99
debugger 310 ELF/DWARF format 10, 333
debugging information 310 else directive 218 , 219, 222, 228, 230,
debugging information, data 310 237
debugging support 309 embedded application 274
decimal digit 113 end directive 220
decimal digit string to a number 113 end5 directive 224
4 Index
endc directive 230, 237 find double 102
endif directive 218, 221, 222 , 228 find first character in string 163
endm directive 223 , 242, 245, 257 find first occurrence of string 174
endr 253 , 254 find in string 171
enforce prototype declaration 446 find last occurrence in string 172
environment symbol 207 find lenght 167
EPAGE area 51 find within a directory pathname 172
EPAGE register 51 first occurrence in buffer 129
EPAGEregisters access 450 first segment, default 296
equ directive 225, 261 flags 6
erase 98 float division 392
error file name 73 float multiplication 393
error files path 67 float type 62
error message 66 float,+sprec option 291
error message, for undefined symbol 194 floating point 445
error messages, list 335 floating point library 74
escape, character 277 Floating Point Library Functions 75
even boundary 70 floating point remainder 105
even directive 226 floor function 104
exclusive options 357 fmod function 105
executable image 320 format 274
exit function 100 format description 150
exp function 101 format of output 275
exponential 101 format specifiers 138
expression 201 formatted argument 158, 188 , 189
expression evaluation 202 formatted arguments 138
extract 136 formatted input 150, 161
extract file in library 327 formatted string 138
fraction and integer from double 136
F free 106
fabs function 102 free function 106
fail directive 227 freestanding programs, use of linker 274
faster code 70 frexp function 107
faster code production 449 from input buffer 109
file length restriction 310 full eeprom space 98
file names 72 function arguments 312
filename 172 function text 54
fill bank 318 functions returning int 77
fill character 134 fuzzy 147
fill character throughout eeprom buffer 99 fuzzy instructions 53
fill segment 280 fuzzy library 292
filling byte 193, 210 , 217, 226, 250 fuzzy logic 53
find 80, 84, 121
Index 5
G ifndef directive 237
generate 145 ifne directive 238
generate debugging information 447 -ik,checksum 299
getchar function 108 include assembler 207
gets function 109 include directive 239
global options 278 include file 285
graphic character 114 include path definition 68
graphic characters 114 include path specification 445
group, option 276 initialization option 281
initialized segments 296
H inline a function 41
inline assembly code 45
hardware interrupt 47
inlined function 41
hardware specification, matching 294
inlining machine library 449
header files 76
inlining machine library calls 70
heap control 57
input and output 36
heap location 59
input suffix 324
heap pointer 57
input to output 144
heap space 88 , 106
input/output 42
heap start 57
input/output stream 75
heap top 57
input-output registers 43
-help option 6
insert assembly instructions 44
hexadecimal digit 120
instructions, mnemonics 196
high expression 202
integer 96
hyperbolic arccosine 124
integer library 292
hyperbolic cosine 95
interface information,dump 330
hyperbolic sine 101, 157
interrupt function 47
hyperbolic tangent 179
interrupt functions 306
interrupt handler 47
I interrupt vectors 47
IEEE Floating Point Standard 62 invoke compiler 65
IEEE695 format 330 isalnum function 110
IEEE695 format converter 10 isalpha function 111
if directive 218 , 222, 228 iscntrl 112
if directive 221 isdigit function 113
ifc directive 229 isgraph function 114
ifdef directive 230 islower function 115
ifeq directive 231 isprint function 116
ifge directive 232 ispunct function 117
ifgt directive 233 isspace function 118
ifle directive 234 isupper function 119
iflt directive 235 isxdigit function 120
ifnc directive 236
6 Index
J logical end address 282
jsr instruction 51 logical end address, value 286
logical start address 282, 288 , 294
L logical start address, value 286
logical starting address 49
label 198
long division 411, 413
labs function 121
long integer 62, 123
ldexp function 122
long multiplication 414
ldiv function 123
longjmp function 126
leading whitespace 118
look for in two buffers 130
length of a string 167
low expression 202
libraries, building and maintaining 326
lowercase 119, 181
library file 291
lowercase alphabetic 115
library path 279
lowercase menmonics 46
library, scanned 277
line format 310
line number 310 M
line number information 449 macro argument 203
linear physical addresses 331 macro directive 242
lines kept,optimization 452 macro instruction 202
link command fil 278 macro internal labels 198
link command file 21 main function 306
linker 275 main() routine 32
linker command file 276, 307 malloc function 127
linker command item 276 map 129 , 163
linker comment 277 map file 306
linker global command line options 279 map information production 279
linker input/output 274 map to percent signs 112
list directive 240 max function 128
list file in library 327 maximum 128
listing file location 28 maximum available space 281, 294
listing stream 195 maximum window size 49
listings generate 73 MCS12 70
load all files at link time 326 MCS12 family 193
local directive 241 memchr function 129
local variables,reorder 447 memcmp function 130
locate source file 314 memcpy function 131
log errors 193 memhc12 function 132
log errors file 68, 279, 445, 449 memmove function 133
log function 124 memory 149
log10 function 125 memory location 42
logarithm 124 memory mapped 42
logical address 282 memory mapped I/O port 42
Index 7
memory mapped input/output control reg- object image 273
isters 34 object list,reorganization 318
memset function 134 object module format 274
messg directive 244 object module inspector 10
mexit directive 243, 245 obsolete syntax 208
min function 135 offset coding 70
minimum 135 offset directive 249
mlist directive 246 offset setting 289
modf function 136 offset,parameter 288
modify compiler operation 355 old Motorola syntax 208
Modules section 306 operators 201
Motorola S-Records format 321 optimizer options specification 69
Motorola syntax 196 options request 66
movb/movw instructions 70 org directive 250
moveable code segment 103 output 138
multiple banks 294 output file name 278
multiply 122 output formats 138
output line number 445
N output only 114, 116
name regions, control 276 output suffix 324
named syntax 204 output to buffer 158, 188 , 189
named syntax, example 243 output to stdout 138
natural 124 overlap 289
natural logarithm 124 overlap checking 282
negative integer 104 overlapping control 282
new region 285 overlapping segment 291
new segment, built 291 override data bias 320
new segment, start 280 override text bias 320
new segments, control 276
new symbol table 300 P
new symbol, definition 286 page boundaries 12
nolist directive 247 page directive 251
nopage directive 248 page expression 202
numbered syntax 203 page registers 51
numbered syntax, example 243 paged architecture 288
numeric constants 200 paged program,building 302
numerical value definition 282 paginating output 315
parameter 203
O parenthesis 40
object file location 28 parser 444
object file output 195 parser behaviour 445
object files path 68 parser options specification 69
8 Index
partitions 107 put to output buffer 144
pc relative addressing mode 52, 197, 449 putchar function 143
pcr register 198 puts function 144
phase angle of a vector 84
physical address 49 , 282, 331, 333 Q
physical end address 280 quotient 96, 123
physical end address,value 287
physical memory 275 R
physical start address 280, 288, 294 rand function 145
physical start address,value 287 random number generation 160
PIC code 53 range specification 315
plen directive 252 read 150
Position Independant Code 52, 449 read from string 161
positive integer 89 realloc function 146
pow function 137 reallocate on the heap 146
pragma definition 39 redirect output 315
pragma directive 40 REFs 300
pragma sequences 44 relative address 310
predefined compiler option selection 69 relocatable expression 201
predefined sections 39 relocatable object 328
prefix character 200 relocatable object file size 328
prefix filenames 447 remainder 96, 123
preprocessor 445 reorder local variable 447
print debugging information, file 312 repeat directive 253
print debugging information, function repeatl directive 254
312 replace 171
printable characters 116 replace file in library 326
printf function 138 restore 126
private name regions 301 restore directive 256
private name regions, use of 302 reverse bitfield 71
private region 285 reverse bitfield order 446
processor address 294 revhc12 function 147
processor type 193 revwhc12 function 148
programmable compiler option 356 rexit directive 253, 254, 257
programmable option 357 ROM 42
programmable options 355 rotate through angle theta 156
propagate in buffer 134 rotate vector through angle 94
prototype declaration 446 round to 89, 104
pseudo-random number 145, 160 round up segment address 282
public region 285 runtime startup 31
punctuation character 117
punctuation characters 117
Index 9
S source listings 314
save 154 space 127 , 146
save and restore page register 51 space allocate 88
save directive 258 space name 289
sbreak function 149 space name, definition 282
scanf function 150 spc directive 262
section 273 specific optimizations 451
section directive 259 specific options 4
section name 40, 206 specify 138
section predefinition 206 sprintf function 158
sections 206 sqrt function 159
sections,relocation 288 square brackets 40
seed 160 square root 159
segment control options 278, 280 srand function 160
segment definition 273 sscanf function 161
segment marked 27 stack need 307
segment name 281 stack offset 310
Segment section 306 stack overflow checking 448
segment size, maximum 281 stack pointer 32
segment, zero size 277 stack space 106
segmented architecture 289 Stack Usage section 306
separate section 71 standard ANSI libraries 291
separated address space 289 standard behaviour 208
set directive 261 startup routine, initialization 297
set new level 128, 135 static data 312
setjmp 126 stop execution of program 100
setjmp function 154 storage boundaries, enforcing 444
shared data, segment 281 strcat function 162
short int 62 strchr function 163
signed char 447 strcmp function 164
sin function 156 strcpy function 165
sine 156 strcspn function 166
single bank, definition 294 string 130 , 162, 167, 174
single precision floating 291 String constants 200
single precision library 291 strings 164, 168, 169 , 170
single precision option 292 strlen function 167
single precision,=sprec option 291 strncat function 168
single section 450 strncmp function 169
sinh function 157 strncpy function 170
skip 118 strpbrk function 171
software interrupt 47 strrchr function 172
source files listing 314 strspn function 173
strstr function 174
10 Index
strtod function 175 U
strtol function 176 undefined symbol 301
strtoul function 177 unreachable code,eliminate 11
suffix letter 200 unsigned char 447
suppress a function 450 unsigned long division 417, 418
suppress pagination 315 uppercase 115, 180
suppress unused functions 71 uppercase character 119
switch directive 206, 263 uppercase mnemonic 46
symbol definition 286 user-defined 445
symbol table information 328 user-defined preprocessor symbol 68
symbol table, add 286
symbol,export 305 V
Symbols section 306
va_arg macro 182
symbols, define 276
va_end function 184
system bootstrap 274
va_start macro 186
variable length argument list 184 , 186
T variables in data bank 12
tabs directive 264 vector 156
tan function 178 verbose 69
tangent 178 verbose mode 19
tanh function 179 volatile 34
task entries 306 vprintf function 188
temporary files path 69 vsprintf function 189
test 111
test for 110, 112, 113, 114, 115 , 117, W
118, 119 , 120, 128, 135
wavhc12 190
text 144
whitespace character 118
text line 109
widen argument 446
text/data section overlap 283
widen to int 182
title directive 265
window base register 49
tolower function 180
window mechanism 12
toupper function 181
window shift 279 , 288
translate executable images 320
window size 50, 282, 294
type 128, 135
windowed area, matching 294
type cast 88
word aligned 40
type casting 128, 135
word aligned constants 54
type checking 444
write to output stream 143
type definition 182
type name 182
type qualifier 37
X
x to the y power 137
xdef directive 266, 267
xdef directive,produce 449
Index 11
xref directive 266, 267
xref.b directive, external 207
Z
zero page 25, 37
zero page section 212, 283
zero page, section 37
zpage 37
12 Index