home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
Dloads
/
PROGRAMM
/
CTUTOR.ZIP
/
PCCDOC.ZIP
/
PCC.DOC
Wrap
Text File
|
1988-12-01
|
168KB
|
4,450 lines
Personal C Compiler
PCC 1.2b
A Product of C WARE CORPORATION
Copyright (c) 1988 C WARE CORPORATION
All Rights Reserved
PCC is a fully operational and tested C Compiler. This is NOT
cripple-ware. As a reward for registration, you will receive a
disk with several utilities to enhance the compiler:
1. Clist - reads C source files and produces a listing file
with a symbol cross-reference.
2. Lib88 - object code librarian. Reads object files and
other library files and produces library files.
3. Profile - C program execution profiler. Monitors program
execution and shows where time is spent in the
program.
4. Xarray - A library of memory access functions to use the
entire 640K RAM space. With source.
Registered users are also eligible to purchase several useful
utilities to further enhance the capabilities of the compiler.
1. The Legal Stuff
This version of the documentation, software and copyright
supersede all previous versions of PCC.
PCC software copyright (C) 1988 by Mark DeSmet and C WARE
CORPORATION. All rights reserved.
This document copyright (C) 1988 C WARE CORPORATION. All rights
reserved.
Specifications subject to change without notice.
Most of the hardware names in this manual are trademarks or trade
names of specific manufactures.
Legal Stuff Page 2
1.1. License
This PCC is NOT public domain or free software, but is being
distributed as "shareware".
PCC is copyright (C) 1988 by Mark DeSmet and C WARE CORPORATION.
Non-registered users of this software are granted a limited
license to make an evaluation copy for trial use on a private,
non-commercial basis, for the express purpose of determining
whether PCC is suitable for their needs. At the end of this trial
period of THIRTY DAYS you MUST either register your copy or
discontinue using PCC.
A PCC registration entitles you to use the program on any and all
computers available to you, as long as you use the program on
only one computer at a time with the following restriction:
All users are granted a limited license to copy PCC only for the
trial use of others. This license does NOT include distribution
or copying of this software package:
1. In connection with any other product or service except as
noted below.
2. For general use within a company or institution.
3. Distribution in modified form. This license information
MUST be included, along with the full PCC documentation
and all PCC files as released by C WARE CORPORATION.
Operators of electronic bulletin board systems (SYSOPS) are
encouraged to post PCC for downloading by users.
If you are the distributor of a public domain or user-supported
software library, you may be distribute copies of PCC. A fee,
not to exceed $10.00 per disk, may be charged for copy service,
handling and materials. The files MUST be distributed in
"archived" form so users may be able to adequately verify the
integrity of the files.
The additional utilities available to registered users shall NOT
be distributed by any individual or organization other than C
WARE CORPORATION.
1.2. Support Policy
The nature of this product and the pricing makes it necessary for
us to NOT provide telephone support for users except as noted
in the pricing schedule below. We will have to refuse to answer
questions unless you have registered the product AND paid for
phone support. Every attempt will be made to address questions
left on our support BBS in an appropriate and timely manner.
However, this support will be on a when-time-is-available basis
and C WARE CORPORATION is NOT responsible to provide support in
any form for non-registered or registered users. Information
will be posted on our support BBS when it becomes available as
Legal Stuff Page 3
well as bug fixes or patches. Upgrades to PCC will be made when
appropriate to improve, enhance or correct the product.
1.3. DISCLAIMER
The author has taken due care in preparing this manual and the
programs and data on the electronic media accompanying this book
including research, development, and testing to ascertain their
effectiveness. The author and the publisher make no expressed or
implied warranty of any kind with regard to these programs nor
the supplemental documentation in this book. In no event shall
the author or C Ware Corporation be liable for incidental or
consequential damages in connection with or arising out of the
furnishing, performance or use of any of these programs.
1.4. FOREIGN RESHIPMENT LIABILITY
THIS LICENSE AGREEMENT IS EXPRESSLY MADE SUBJECT TO ANY LAWS,
REGULATIONS, ORDERS OR OTHER RESTRICTIONS ON THE EXPORT FROM THE
UNITED STATES OF AMERICA OF SOFTWARE, OR OF INFORMATION ABOUT
SUCH SOFTWARE, WHICH MAY BE IMPOSED FROM TIME TO TIME BY THE
GOVERNMENT OF THE UNITED STATES OF AMERICA. NOTWITHSTANDING
ANYTHING CONTAINED IN THIS AGREEMENT TO THE CONTRARY, YOU MAY NOT
EXPORT, DIRECTLY OR INDIRECTLY, ANY SUCH SOFTWARE OR INFORMATION
PERTAINING THERETO TO ANY COUNTRY FOR WHICH SUCH GOVERNMENT OR
AGENCY THEREOF REQUIRES AN EXPORT LICENSE OR OTHER SUCH
GOVERNMENT APPROVAL AT THE TIME OF EXPORT WITHOUT FIRST OBTAINING
SUCH LICENSE OR APPROVAL.
1.5. LIMITED WARRANTY
PCC IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
PCC IS WITH YOU.
SOME STATES DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO
THE ABOVE EXCLUSIONS MAY NOT APPLY TO YOU. THIS WARRANTY GIVES
YOU SPECIFIC LEGAL RIGHTS AND YOU MAY ALSO HAVE OTHER RIGHTS
WHICH VARY FROM STATE TO STATE.
C Ware does not warrant that operation of PCC will be
uninterrupted or error free.
1.6. LIMITATIONS OF REMEDIES
If C Ware is unable to deliver a copy of PCC that is
satisfactory, then you may obtain a full refund by returning all
PCC materials and documantation within thirty days of delivery to
you as evidenced by a copy of your receipt.
Legal Stuff Page 4
This refund is the entire extent of C Ware's liability and your
exclusive remedy.
IN NO EVENT WILL C WARE BE LIABLE TO YOU FOR ANY DAMAGES,
INCLUDING ANY LOST PROFITS, LOST SAVINGS OR OTHER INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
PCC EVEN IF C WARE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY.
SOME STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY
FOR INCIDENTAL OR CONSEQUENTAIL DAMAGES SO THE ABOVE LIMITATION
OR EXCLUSION MAY NOT APPLY TO YOU.
1.7. General
This Agreement will be governed by the laws of the State of
California.
Should you have any questions concerning this Agreement, you may
write to C Ware Corporation, PO Box 428, Paso Robles, CA 93447.
YOUR CONTINUED USE OF PCC BEYOND THE THIRTY DAY TRIAL PERIOD,
WITH OR WITHOUT REGISTRATION, ACKNOWLEDGES THAT YOU HAVE READ
THIS AGREEMENT, UNDERSTAND IT AND AGREE TO BE BOUND BY ITS TERMS
AND CONDITIONS. YOU FURTHER AGREE THAT IT IS THE COMPLETE AND
EXCLUSIVE AGREEMENT BETWEEN US WHICH SUPERSEDES ANY PROPOSAL OR
PRIOR AGREEMENT, ORAL OR WRITTEN, ANY ANY OTHER COMMUNICATIONS
BETWEEN US RELATING TO THE SUBJECT MATTER OF THIS AGREEMENT.
1.8. TRADEMARKS
MS-DOS is a registered trademark of Microsoft Corporation.
PC-DOS is a registered trademark of IBM Corporation.
Compaq is a registered trademark of Compaq Inc.
Tandy 1000 is a registered trademark of Tandy Corporation.
1.9. ORDERING INFORMATION
A PCC registration licenses you to use the product on a regular
basis. Users need register only one version of PCC. Registration
includes licensed use of all upgrades. Registered users can
always get the most current version of the program at a nominal
fee ($8.00 as of this writing) by calling or writing C WARE
CORPORATION. The latest version will also be available on our
support BBS at (805)-239-4834 and the below listed "official
distribution BBSs":
1. PYSMATIC BBS, Sunnyvale, CA (408)-992-0372
If you purchased PCC through a distributor of public domain or
user-supported software, you did NOT pay for the license. The
fee ($10.00 max per disk) was to cover the costs of copying the
Legal Stuff Page 5
disk(s), the media and handling overhead. You paid for the
vendors service.
Registration for PCC costs $30 and assumes you have already
received a copy of the program from whatever source. We will
also send you the next major upgrade of PCC when it is released OR
if you ask when you register, we will send you a certified copy of
the current version of the program, and you must download or send us
$8.00 to get the next major upgrade.
1.10. Use by Educational Institutions
Educational institutions wishing to use PCC for courses involving
C MUST obtain a site license. State or city operated
institutions shall pay $10.00 per student using the program.
Private or commercial institutions shall pay $15.00 per student
using the program. All reproduction of documentation and media
shall be done by the licensed site institution. The additional
utilities offered to registered users may be purchased at 66% off
for state or city operated institutions and 50% off for private
or commercial institutions.
Students using the program via this method are NOT registered
users and must register their copy as per the licensing agreement
for an indivdual if they use the program after completion or
termination of the course.
1.11. Corporate, Business, Government and Commercial Use
Corporate, business, government or other commercial uses of PCC are
PROHIBITED. We offer an excellent C Development Package for such
commercial users. Please contact C WARE CORPORATION directly for
information and pricing. The intent of PCC is to provide a low
cost tool for persons interested in learning C or using C
for non-commercial personal use. If you find you wish to sell a
program developed with PCC, you must do the following:
1. The program and documentaion must prominently indicate
the code was compiled with PCC, copyright 1988 by
Mark DeSmet and C Ware Corporation.
2. Get written permission ( which is no big problem ) by
sending us a copy of the program as it is to be sold or
distributed. A letter granting permission will be sent
promptly, if your package meets the requirements of
paragraph 1 above.
ALL PRICES ARE SUBJECT TO CHANGE WITHOUT NOTICE.
Legal Stuff Page 6
You can also register/order your copy of PCC by phone, using your
MasterCard or VISA. Phone (805)-239-4620, 9:00 - 4:00 p.m. PST
or PDT only. Minimum credit card order is $10.
Sorry, C.O.D. orders will NOT be accepted.
ORDERS OUTSIDE THE US: Please use your Mastercard or VISA when
ordering, or send checks drawn on US banks in US dollars. All
checks must have US bank magnetic routing symbols. Please
include an additional $5 to cover postage on orders to be sent
outside of the US.
Full-time students can apply a 10% discount on all prices. You
MUST include your a photo-copy of your most recent registration
slip and student ID card.
PRICE SCHEDULE AND INFORMATION ( November 1988 )
1. Individual Registration - $30.00
- Copy of program sent if requested
- Utility package sent automatically
*** Below items only available to registered users. ***
2. Editor - $15.00
- With object code
3. Debugger - $15.00
4. MS DOS Linker compatability utility - $ 8.00
5. Special utilities package - $ 8.00
6. Five phone support calls (5-min). - $15.00
- Total 25 minutes of help time
NOTES:
1. The above prices include CA sales tax.
2. Sorry, we do not have a printed manual available.
3. For fastest service please send Money Order or use Visa
or MasterCharge. We must wait 10 days for personal
checks to clear.
4. Please allow 30 days for delivery. Money order, Visa and
MasterCharge should ship in two(2) working days but
things do get hectic at times. Drop us a line if you
haven't received your order in 15 days.
5. Please use the form in appendix C to order.
Preface Page 7
2. Preface
The PCC package would not exist but for the tireless work of
L. B. Neal. He has called us, badgered us, sent us manuals and
materials, jumped up and down about the virtues of Shareware, and
in general demanded that we create the personal C compiler, PCC.
The PCC package owes everything else to the incredible work of
Mark DeSmet. At a time when most programmers couldn't spell C,
Mark wrote a compiler, assembler, linker and library for not one
operating system, but two. The fact that it is still the fastest
C compiler in the current benchmarks further attests to Mark's
skills.
This manual describes the C Ware Personal C Compiler for the IBM-
PC personal computer and the other MS-DOS based personal
computers. It is based on the DeSmet C Development Package. If
you are unfamiliar with the C language or UNIX, the book The C
Programming Language by Brian Kernighan and Dennis Ritchie is
available. If you plan on coding in assembly language, it is
advisable to get a manual on the Intel 8086 microprocessor.
Books such as Intel's ASM86 Language Reference Manual or The 8086
Family User's Guide are good choices. These manuals fully
describe the architecture and the instruction set of the
8086/8088 family of microprocessors.
An Introduction to PCC Page 8
3. An Introduction To PCC
Now that we made it through all of the formalities lets take a
look at what PCC contains.
PCC is a fast powerful C compiler. It is fully compatable
with code written for DeSmet Ver: 2.51. Code for earlier
versions of DeSmet should work with minimal adjustment.
This compiler is NOT full of bells and whistles it just
makes fast tight compact programs.
Some of the terms and conventions of PCC are a bit different
from those in books on the C language, so we will quickly run
through the terms used in PCC.DOC.
TEXT OR BOOK NAME PCC NAME COMMENT
----------------- -------- -------
LINK PCCL Builds .EXE file
filename.obj filename.o Basis for .EXE file
filename.asm filename.a Assembly source file
MASM or ASM PCCA 8088/8086 Assembler
CC or CPP PCC Main Compiler
(First Pass)
CC1 PC2 Compiler Second Pass
3.1. Using Text, Book, Magazine or Download source code
There are many C compilers. There are also many variations of
interpretation of what C syntax should be. And then there are
the extensions to support I/O, machine specific functions, etc.
Source NOT written for PCC or DeSmet Ver: 2.51 may need minor
adjustments to be accepted by the PCC compiler and run properly.
In fact, finding, compiling and modifying source code is an
excellent way to learn any language or compiler. Just be careful
not to adopt bad habits from exposure to poorly written code.
*****************************************************************
CAUTION: PCC will accept any valid code you supply to it, as will
any compiler. The code may well be valid, but the result of the
code could be dangerous to the health and safety of your
computer, monitor or contents of your Hard Drive or floppies
( and it WILL be at one time or another ). Guard and maintain
up-to-date copies of all files on your system. If your program or
the compiler starts to act erraticly: i.e. screen goes blank, funny
An Introduction to PCC Page 9
video display, noises from hardware, or any strange unexpected
actions., IMMEDIATELY TURN OFF THE POWER to the computer and
investigate carefully after you have the system rebooted.
******************************************************************
THE REST IS UP TO YOU
C is a powerful and useful language, we hope you find PCC a help
to your learning and use of the C language.
Your comments and suggestions on how to improve our product are
welcome.
Enjoy your adventure into the land of C and we hope PCC helps you
in your computing.
3.2. Getting Started
First things first. Copy all of the files from the distribution
disk onto a set of working floppy diskettes or hard disk. The
package is not copy-protected so the MS-DOS copy command can be
used to copy the files. The package is distributed on a single
double-sided (360KB) diskette. The distribution diskette should
never be used, it should be kept as the backup copy of PCC.
Lets make sure the compiler files are intact. A source program
called DUMP.C has been provided in this package. Place the files
from PCC12B.ARC in a directory of your choice or on floppy disks
per the later documentation. To compile DUMP.C enter
>PCC DUMP
This will compile DUMP.C into an object module DUMP.O. To link
DUMP.O with the required library functions in PCCS.S enter
>PCCL DUMP
This will produce a file DUMP.EXE. To run DUMP.EXE enter
>DUMP DUMP.C
This will produce a hex and ascii dump of DUMP.C on your screen.
If DUMP runs correctly, then the compiler should be in good
working order.
3.3. PCC Files
The package is distributed as a compressed file -- PCC.ARC -- so
that integrity checks may be run. PCC.ARC contains the following
files:
BUF128.A Source code for 128 byte type-ahead TSR.
BUGS!.EXE Arcade game (use 'BUGS! c' for color displays).
DUMP.C Source code for hex file display utility.
An Introduction to PCC Page 10
EXEC.O The Exec() and Chain() functions.
LATER.C Source code for a file modification date checking
program.
LIFE.C Source code for the game of Life.
MATH.H Include file for the Standard Math package.
PC2.EXE The second pass of the C compiler.
PCC.DOC This file
PCC.EXE The first pass of the C compiler.
PCC7.S The standard C function library with 8087 support.
To use this library, rename it to PCCS.S.
PCCA.EXE The assembler and third pass of the C compiler.
PCCL.EXE The object file linker.
PCCS.S The standard C function library with software
floating-point support.
PCIO.A Source code for the PC screen functions.
RAM.COM RAM Disk driver for DOS 2.0 and later operating
systems.
SETJMP.H Include file for the setjmp()/longjmp() functions.
STDIO.H Include file for the Standard I/O package.
3.4. Basic System
The minimum files you need from PCC.ARC are PCC.EXE, PC2.EXE,
PCCA.EXE, PCCL.EXE and PCCS.S. The files STDIO.H and MATH.H
contain useful declarations.
If you are developing in a directory other than the one that
contains the PCC files, be sure to set the PATH environment
variable to include the PCC directory.
3.5. Setting Up DOS 2.xx, 3.xx, ...
For systems utilizing DOS 2.x or later versions of the operating
systems, make sure that the ASCII text file CONFIG.SYS exists on
your boot disk.
The file must contain the line:
FILES=20
since PCC supports 20 open files Q stdin, stdout, stderr, and 17
other files. The default number of eight is insufficient for the
PCCL program.
If there is enough memory available, add the line:
BUFFERS=20
to improve file performance in the operating system. 512 bytes
are allocated for each buffer specified.
An Introduction to PCC Page 11
3.6. RAM DISK
If you have a system with more than 256 kilobytes of memory, then
the Ram Disk driver RAM.COM can be used to create an extremely
fast disk. To add a Ram Disk, copy the RAM.COM file from the
distribution diskette to the system disk and add the line:
DEVICE=RAM.COM n
to the CONFIG.SYS file. The parameter, n, is a decimal number
from 32 to 650 indicating the size of the Ram Disk. The value is
specified in units of one kilobyte (1024).
Re-boot the system to install the Ram Disk. The drive letter
used for this 'disk drive' is dependent on the configuration of
the system. DOS will install the Ram Disk at the first free
device "slot". For an IBM PC with two floppies, this will
probably be drive C:. For an XT, it will probably be drive D:.
Sanyo 550/5 reserves the first four slots for its floppies, so
the Ram Disk is drive E:. To find where DOS has installed the
Ram Disk, use
chkdsk x:
where x takes on the values c, d, .... You will get either a
disk error, or a return showing the size of the Ram Disk. Once
you find it, the Ram Disk will always be the same until you add
other device drivers before it in the CONFIG.SYS file.
3.7. Completion Codes
The PCC, PCCA, and PCCL programs set the completion code to:
zero if no warnings or errors occurred,
one if warnings were issued, and
two if errors occurred.
Batch files can take advantage of these values to stop execution
or otherwise handle these exceptional cases.
The following batch file will stop on a PCC or PCCL error:
PCC %1
if errorlevel 1 goto stop
PCCL %1
if errorlevel 1 goto stop
%1
:stop
More complicated development situations can be handled with the
program LATER which is supplied in source form in the file
LATER.C. LATER takes a list of filenames as arguments. It sets
the errorlevel to one if the last file does not exist or if the
last file has an earlier modification date than any other file in
the list. It can only be used on systems with a battery backup
clock or where users are careful about setting the date and time
An Introduction to PCC Page 12
when the system is brought up. Assume a program is composed of
the files moda.c, modb.c, modc.c and the include file mod.h. The
following .BAT file can be used to regenerate the program
whenever a module changes:
later moda.c mod.h moda.o
if errorlevel 1 PCC moda
if errorlevel 1 goto stop
later modb.c mod.h modb.o
if errorlevel 1 PCC modb
if errorlevel 1 goto stop
later modc.c mod.h modc.o
if errorlevel 1 PCC modc
if errorlevel 1 goto stop
later moda.o modb.o modc.o mod.exe
if errorlevel 1 PCCL moda modb modc -omod
:stop
This provides a service similar to the UNIX MAKE program. Only
those files that need to be compiled will be compiled.
PCC -- The Personal C Compiler Page 13
4. PCC -- The Personal C Compiler
4.1. Introduction
PCC is the C compiler for the 8088/8086 family of
microprocessors. It accepts C source programs as input and
produces object files. The model employed by the compiler
efficiently utilizes the 8088/8086 architecture but limits a
program to 64KB code and 64KB of data.
Invocation
PCC <filename> [options]
<filename> is the name of the file containing the C source. If it
does not include an extension, the extension '.C' is
assumed.
Options: The case of the option is not significant. Each option
should be separated from other options by blanks. Options may be
preceded with the dash (-) character.
A - assembly output. This option indicates that the
compiler should produce an assembly language source
file instead of an object file. The name of the
assembly language file will be the same as the name of
the source file but will have the extension '.A'.
D<name> - compiler drive specification. The compiler assumes
that the files PC2.EXE and PCCA.EXE are in the
default directory on the current drive. This option
is used to inform the compiler that the files are on a
different drive. For example, if the compiler is on
drive 'M', then the option 'DM' is needed.
Under MS-DOS 2.0 and later versions of the operating
system, this option is rarely needed as the system
PATH variable is also used to find the other passes of
the compiler.
I<name> - include path name. This option overrides the
default drive/directory for files included with the
#include control. The directory name must end with a
trailing backslash (\) character (e.g. -
ic:\src\include\). See section 4.4.1 for #include
details.
N<defname>=<defvalue> - specify #define name and value. Used to
set debugging switches or constant values without
editing the file. This option is equivalent to
#define defname defvalue
at the begining of the program.
PCC -- The Personal C Compiler Page 14
To set <defname> to one, enter n<defname>, which is
equivalent to
#define defname 1
Spaces are not allowed.
O<filename> - output filename. The compiler will produce an
object file with the specified name. If the name
lacks an extension, the extension '.O' will be added.
The default object name is the same as the source name
with the extension of '.O'.
T<drive> - specifies the drive that the compiler should use for
its temporary files. If not specified, the compiler
will build its temporary files on the default drive.
If this drive is close to being full, the 'T' option
should be used to change the drive for the
temporaries. Also, if the RAM Disk has been
installed, placing the temporary files there will
drastically cut the amount of time needed to compile a
program.
4.2. Examples
PCC blip
compiles the file named blip.c. The object file will
be named blip.o.
m:PCC b:blip.ccc tm dm
runs the compiler from drive M on the file b:blip.ccc.
Temporary files are also written on drive M. Note the
use of the D option to indicate the location of the
other passes of the compiler. The object file will
also be named blip.o.
PCC blip -ic:\inc\ -a -nNewVersion -nNYear=1985
compiles the file named blip.c. Include files are
taken from the directory c:\inc\. An assembly
language file is generated named blip.a. The 'N'
options are equivalent to adding
#define NewVersion 1
#define NYear 1985
to the start of blip.c
PCC -- The Personal C Compiler Page 15
4.3. The C Language
PCC compiles C programs that conform to the standard definition
of the C language as described in the book The C Programming
Language by Brian W. Kernighan and Dennis M. Ritchie. The
following documentation describes the implementation.
4.3.1. Preprocessor directives
#define defines a macro with or without parameters.
#undef, #ifdef and #ifndef - tests the status of the #defined
macros
#include includes other files into the program. #include's
can be nested to a maximum depth of 3.
#include "filename" will search the default directory
for the file filename. #include <filename> will first
search the default directory for filename. If the
file was not found, the environment (see DOS 2.X/3.X
SET command) is searched for the variable INCLUDE .
If the variable is found, it is assumed to contain a
set of directory prefixes separated by semi-colons.
For example, if INCLUDE is set as follows
C>set include=c:\;c:\usr\include\
then the line
#include <world.h>
would cause PCC to search for
world.h
c:\world.h
c:\usr\include\world.h
#if, #else, #endif - conditionally includes or excludes source
statements.
4.3.2. Data Types
char Unsigned byte with a range of 0 to 255.
int
short Signed Integer with a range of -32768 to 32767.
unsigned Unsigned integer with a range of 0 to 65535.
long Signed integer with a range of -2147483648 to
2147483647.
float Four byte floating point value. A float number has
about 7 digits of precision and has a range of about
PCC -- The Personal C Compiler Page 16
1.E-36 to 1.E+36. The floating point formats are
defined by the IEEE floating-point standard.
double Eight byte floating point value. A double number has
about 13 digits of precision and a range of about 1.E-
303 to 1.E+303.
(pointer) pointers are two bytes, limiting total data space to
64KB.
To take advantage of the 8088/8086 instruction set, expressions
involving only char types are not coerced to int before
evaluation. The sum of a char equal to 255 and a char equal to 1
is 0 rather than 256. Constants are considered to be int values
so that constant plus char is a two byte integer operation.
4.4. Extensions
The UNIX Version 7 extensions -- enumerated types, extended
member name-space, and structure assignment are fully supported.
Enumerated types provide a convenient method of declaring an
ordered set of named constants. Values start with zero, and may
be reassigned with a name = value expression. The same value may
be assigned to several names. For example
enum color {red, blue=4, green} ca, *cp;
enum color cb;
if(ca == red)
cb = green;
is equivalent to
#define red 0
#define blue 4
#define green 5
int ca, *cp;
int cb;
if(ca == red)
cb = green;
Extended member name-space relaxes the K&R requirement that if a
member name appeared in more than one structure or union, then it
had to have the same data type and offset in every appearance.
Now, the only restriction is that the member name must be unique
within the structure or union. If a member name is used that is
not in the referenced structure, the warning
member not in structure
is issued. As a loophole, a pointer to char may be used as an
PCC -- The Personal C Compiler Page 17
anonymous pointer to any structure.
struct {int i, j, k;} zip;
struct {int j; char i;} zap, *zp;
char *cp;
zip.i = 1; /* OK */
zap.i = 1; /* OK */
zap.k = 1; /* WARNING */
zp->i = 1; /* OK */
zp->k = 1; /* WARNING */
cp->k = 1; /* OK, ANONYMOUS */
Structures can be assigned, used as parameters, or returned from
a function. CAUTION: this may create problems with existing
programs because previous versions of PCC converted the name of a
structure in a parameter list to a pointer to that structure,
while the current release pushes the entire structure. To
highlight this potential problem, PCC will issue the following
warning
structure assignment
when structures are passed by value, and the warning
returns structure
when a function returns a structure. These warnings will be
removed in a future release.
struct z {int i, j;} zip, zap, zxax();
main(){
zip = zap; /* structure assignment */
zap = zmax(zip, zap);
}
struct z zmax(a,b) /* func returns struct */
struct z a, b; {
if(a.i > b.i)
return a;
return b;
}
Variable names are significant to 31 characters instead of 8.
A #asm directive has been included to allow in-line assembly
language code for time critical applications. All lines
following a line starting with #asm are passed through to the
assembler. The next line beginning with the "#' character, ends
the in-line assembly code.
PCC -- The Personal C Compiler Page 18
For example:
_move(count, src, tar)
int count; char *src, *tar; {
#asm
MOV CX,[BP+4] ;count
MOV SI,[BP+6] ;src
MOV DI,[BP+8] ;dst
MOV AX,DS
MOV ES,AX
CLD
REP MOVSB
#
}
4.4.1. Forward References
PCC is effectively a one pass compiler so forward references will
not work. The following program:
main() {
i=99;
}
extern int i;
will produce a warning that 'i' is undefined and is assumed to be
a local variable named 'i'. The global variable 'i' will not be
changed.
Structure tags must be defined before being referenced. The only
exception is pointers, so that legal structure declarations
include structures of the form:
struct a {
struct b *x;
}
struct b {
struct a *y;
}
4.4.2. Externs
The rules for 'extern' declarations are:
1. Statements that are global to the source file, like 'int
blip;' may be in several different files that are linked
together. PCCL will allocate 2 bytes for the global
integer variable blip. This is an extension to the standard
rule that restrict global declarations to a single file and
require all the other declarations to be extern.
PCC -- The Personal C Compiler Page 19
2. A declaration that includes the keyword 'extern' may not
include initializers and does not allocate any memory. Thus
a variable so declared must be declared somewhere else
without the 'extern' keyword in order to reserve memory for
the variable. For example, if a file contains the
declaration extern int blip then some other file must
contain the declaration int blip to actually allocate
storage. If this is not done, the binder will complain
about a reference to the unresolved symbol blip. It is
permissible to have both an 'extern' and non-'extern'
declaration in a single file. For example,
extern int blip;
int blip;
is valid.
To create include files containing data declarations -- if the
variable is not initialized (which means it will be initialized
with zeros) either include the declaration:
int blip;
in every file or include the declaration:
extern int blip;
in every file and add the declaration:
int blip;
to one of the files to actually allocate the storage.
If the variable needs initialization, the second approach must be
used. Include the declaration:
extern int blip;
in the include file. Initialize the value in only one file:
int blip = 1985;
These rules are about the same as Version 7 UNIX. Extern rules
are an area of C that are currently controversial. System V UNIX
tried to tighten up the rules but enough people complained that
5.2 is back to normal.
PCC -- The Personal C Compiler Page 20
4.4.3. Macros
Macro arguments are not replaced within a quoted string. For
example, in The C Puzzle Book by Alan Feuer the macros in
<defs.h> use the following construct to customize printf() calls.
#define PR(fmt,v)printf("value=%fmt%t",v);
This does not work with the PCC compiler. Instead add the
following defines to <defs.h>:
#define D "value = %d%t"
#define F "value = %f%t"
#define C "value = %c%t"
#define G "value = %g%t"
and change the PR define to
#define PR(fmt,v)printf(fmt,(v));
Statements of the type
PRINT1(d,x);
must be changed to
PRINT1(D,x);
in the programs. Lower case D, F, C, and G's would allow the
programs to remain unchanged but variables c and g are used in
structure one and variable g is used in structures two and three.
4.4.4. Strings
Literal character strings delimited by quotes ('\"') cannot
contain the NUL character ('\0'). The compiler terminates the
string at the NUL character, even though it checks that the
string has a terminating quote character. If you want NUL
characters in the string for initialization purposes, use an
array assignment.
char init1[]="abcdef@xyz@012", *ip=init1;
while(ip = index(ip, '@'))
*ip = '\0';
The PCCA 8088 Assembler Page 21
5. The PCCA 8088 Assembler
5.1. Introduction
PCCA is the 8088/8086 assembler. It reads assembly language
source files and produces linkable object files.
5.2. Invocation
PCCA <filename> [ options ]
<filename> is the name of the assembly language source file. If
it does not include an extension Q the extension '.A'
is assumed.
Options: The case of the option is not significant. Each option
should be separated from other options by blanks. Options may be
preceded with the dash (-) character.
L[ <filename> ] -- The assembler will produce a listing from the
assembly language input. This listing includes the
hex-values generated by the assembler as well as line
numbers and pagination. If no name is specified, then
the name of the source file with the extension '.L' is
used. If the specified file does not have an
extension, '.L' will be used. Otherwise the listing
is written to the specified file. To generate a
listing on the printer, use '-LPRN:'.
O<filename> The assembler will produce an object file with the
specified name. If the name lacks an extension, then
the extension '.O' will be appended to the name. The
default object file name is the name of the source
file with the extension changed to '.O'.
T<drive> The 'T' option specifies the drive where the assembler
temporary files will be created. If a RAM Disk is
available, redirecting temporary files to that drive
will greatly speed development. The assembler
normally creates its temporary files on the default
drive/directory.
Pnn Specifies page length, in lines. The default is 66.
Wnn Specifies page width, in characters, for the list
file. The value nn must be a number from 60 to 132.
The default is 80.
5.3. Example
PCCA blip
assembles the file named blip.a and produces an object
file named blip.o.
The PCCA 8088 Assembler Page 22
M:PCCA blip.asm -Ob:blip Lblip.lst
runs the assembler from drive M: on the file named
blip.asm. The output is an object file named blip.o
on drive B: and a listing file named blip.lst on the
default drive.
PCCA blip.a TM -oa:blip.o -lb:blip.lst
assembles the file named blip.a. Temporary files are
created on drive M:. The output of the assembler is
placed on drive A: in the file blip.o. A listing file
is generated and written to drive B: in the file
blip.lst
The PCCL Object File Linker Page 23
6. The PCCL Object File Linker
6.1. Introduction
PCCL is the program that links together object and library
modules and forms an executable program. For very long command
lines, see the -f option.
6.2. Invocation
PCCL <filename> <filename> ... [options]
<filename> A sequence of filenames separated by blanks. The
filenames should be the names of object (.O) or
library (.S) files. If a filename does not have an
extension, '.O' is assumed. PCCL automatically looks
for the supplied library PCCS.S so its name should
not be included in the list of filenames.
Options: All options may be in upper or lower case. Options must
be separated by blanks and preceded by a hyphen to differentiate
them from <filename>s. Note that this is different from other
commands where the hyphen is optional.
-A The assembler option keeps PCCL from generating the C
initialization code. Instead, execution begins at the
beginning of the code rather than starting at the
main_ public label. ARGC and ARGV are not calculated
and the stack is not set up. Uninitialized variables
are not filled with zero. Library functions such as
creat() and open() cannot be used as they depend on
the zero initialization. The 'A' and 'S' options are
useful for a few cases but caution should be exercised
in their use.
-F<filename> identifies a file containing <filename>s and options
to be used by PCCL. This is used for very long lists
of filenames and options.
-L<name> specifies the drive/directory containing the PCCS.S
standard library. If this option is not specified,
the PCCS.S file must be on the default drive. With
MS-DOS 2.0 and later versions of the operating system,
the PATH system parameter is used to locate the
library.
-Mn Indicates that the object files following this control
should be collected in the memory-based overlay
indicated by the value n ( 1 to 39 ). See the
description on overlays below for details on the
overlay mechanism.
-O<filename> changes the name of the output file to
<filename>.EXE. If this option is not specified, the
The PCCL Object File Linker Page 24
name of the first object file in the list with the
.EXE extension will be used.
-P[<filename>] Generates a sorted list of publics and offsets. C
procedures and data declared outside of procedures are
automatically public (or extern) unless explicitly
declared static. Publics with names starting with an
underline '_' are not listed unless the -_ option is
also specified. The optional name is the destination
for the publics list. If omitted, the publics and
offsets are listed on the console. The size of
overlays, if any, will also be displayed.
-Shhhh specifies the stack size. hhhh is in hex. Normally,
PCCL will set the stack size as large as possible.
The '-S' option can be used to limit this size for use
with exec().
-Vn This option is used to create disk-based overlays.
All object files following this option, until the end
of the list or another overlay option, are collected
into the overlay indicated by the value n (1 to 39).
See the overlay section below for details.
-_ (underscore) PCCL normally suppresses names that start with an
underscore (usually internal names) from the publics
list. The underscore option restores these publics to
the listing. This option is useful when you need to
see all the modules bound to your program.
6.3. Examples
PCCL blip
binds the file blip.o with PCCS.S and produces the
executable file blip.exe.
PCCL proga progb progc lib.s -p
binds the files proga.o, progb.o, and progc.o with the
user library lib.s and the standard I/O library,
PCCS.S, into the application file proga.exe. The
map is printed on the screen.
PCCL proga progb -V1 progc -V2 progd -Pmap -_ -Omyprog
binds the files proga.o, progb.o with PCCS.S and
creates the executable file myprog.exe and the overlay
file myprog.ov which contains two overlays consisting
of the object files progc.o and prod.o. The publics
map is sent to the file named map and will also list
the internal names that begin with the underline ('_')
character.
The PCCL Object File Linker Page 25
6.4. Space Considerations
A program is restricted to a maximum of 64KB of code and 64KB of
data plus the stack. PCCL calculates the size of code and data
and will report the size of each segment (in hex) when the -P
option is specified. PCCL cannot calculate the actual stack
requirements. If the 'stack' and 'locals' size reported by PCCL
seems small, the actual stack requirements should be calculated
by hand to make sure there is enough space. The actual
requirements are the worst case of four bytes per call plus the
size of locals (including parameters) for all active procedures
plus about 500 bytes for the Operating System calls. In
practice, 2KB plus the size of the local arrays simultaneously
active should be sufficient.
If PCCL reports that the code limit is exceeded, look in the
publics map for the scanf() and printf() routines. These are
relatively large routines (around 2KB each) and also link in the
floating-point routines. Eliminating the use of these routines
can result in a large savings. If scanf() and/or printf() are
necessary but no floating-point values will be used, try using
the PCC7.S instead of the standard PCCS.S library (Rename
the PCCS.S library to something else and rename the PCC7.S
library to PCCS.S). This will assume the availability of the
8087 math chip and will not bring in the software floating-point
routines.
6.5. Overlays
Another way to solve the space problem is the use of overlays.
The overlay system provided by this package is very simple. An
application is divided into a root portion that is always
resident and two or more overlays. Only one overlay is resident
(executable) at any given time. The following diagram outlines
the relationship between the root and the overlays:
There are two types of overlays, disk-based overlays and memory-
based overlays. The difference between the two types is the
location of the overlays. Disk-based overlays, created with the
-V option, are stored in a separate file. Memory-based overlays,
created with the -M option, are loaded into memory along with the
root code. Memory-based overlays should only be used when there
is sufficient memory for the root and all of the overlays. The
advantage of memory-based overlays over disk-based overlays is in
the amount of time needed to make an overlay resident, memory-
based overlays being much faster to load.
The application program is responsible for initializing the
overlay subsystem and ensuring that the correct overlay is
resident before calling any of the functions in the overlay.
For disk-based overlays, the routine overlay_init() must be
called from the root with the name of the overlay file to
The PCCL Object File Linker Page 26
initialize the overlay system. Overlays are loaded by calling
the routine overlay(n) where n is the number of the overlay to be
made resident.
For memory-based overlays instead of disk-based overlays, do not
call the overlay_init() routine and call the routine moverlay()
in place of the routine overlay().
In the following example the root is composed of the file X.C.
The first overlay is the file Y.C and the second overlay is in
the file Z.C.
File X.C:
main() {
overlay_init("X.OV"); /* initialize */
puts("this is the root program\n");
overlay(1); /* make 1st overlay resident */
zip(); /* call into 1st overlay */
overlay(2); /* make the second resident */
zap(); /* call into second overlay */
puts("bye\n");
}
File Y.C:
zip() {
puts(" this is ZIP ");
}
File Z.C:
zap() {
puts(" this is ZAP ");
}
The files are compiled in the usual fashion:
PCC x
PCC y
PCC z
Ordinarily, the files would be linked together using the command:
PCCL x y z
Instead, to create the two overlays, the command:
PCCL x -V1 y -V2 z
is used. The -V option is followed by the overlay number. This
number starts at 1 and runs in ascending order up to 39. All
files following the -V or the -M option are included in the
overlay. All library modules (from .S files) are included in the
root. The result from the execution of the PCCL program with the
-V option is the executable root (.EXE) file and the overlay
The PCCL Object File Linker Page 27
(.OV) file which contains the overlays. The result with the -M
option is an .EXE file containing both the root and the overlays.
The -P option of PCCL will also display the size of each overlay
as well as the overlay for each symbol.
6.6. Libraries
Libraries are just concatenated .O files. The .S extension tells
PCCL to only include modules that are referenced. If all of the
routines in a library are required, rename the .S file to a .O
file to force all of the modules in the library to be included.
PCCL includes the entire .O module from a library if any of its
public names have been selected by other object modules processed
by PCCL. Thus, if a .O file contains several functions, all of
them will be bound into a program if any of them are called.
PCCL searches a library once. Thus if you have two modules, A
and B, and A calls B , the B must follow A in the library. LIB88
attempts to order the library so that these inter-library
references are ordered so that PCCL will find them. One way
around any circular dependencies (e.g., B also calls A ) is to
include the library twice on the command line.
The PCCS.S Standard Library Page 28
7. The PCCS.S Standard Library
7.1. Introduction
This section describes the standard library, PCCS.S, for the
PCC C compiler and PCCA assembler. This library includes
routines similar to routines available in UNIX with some
inevitable differences due to the MS-DOS Operating System.
All of the routines are in the PCCS.S library file provided on
the distribution disk. This file must be on the default
drive/directory, in a directory listed in the PATH system
parameter, or on the drive/directory referred to by the '-L'
option for PCCL to execute correctly.
There is a PCC7.S library that has the same functions as the
PCCS.S libarary but assumes the availability of the 8087 math
chip to perform the floating-point operations. To use the 8087,
rename PCC7.S to PCCS.S.
7.2. Names
Public names starting with the underline character ('_') are
reserved for PCC internal routines and should be avoided. Names
of this form are also employed for user callable routines such as
_move() whose names might conflict with user names.
PCC automatically appends the underline character ('_') to the
end of public names to avoid conflicts with assembly language
reserved words. PCCA does not do this so the underline must be
manually appended to publics used to link with code generated by
PCC. For example, the C puts() routine should be referred to as
puts_ from assembler. PCCL ignores the case of publics, unlike
UNIX, so puts_ matches the name PutS_.
7.3. Program Initialization
PCCL inserts a jmp _csetup as the first executable instruction in
the program. _CSETUP performs the following initialization
functions:
1. sets the data/stack segment size to the lower of: available
memory, 64K, or the size of the static data area plus the PCCL
-S option,
2. Formats argc and argv[] from the Program Segment Prefix,
3. Zeros the Uninitialized Data Area, and
4. Calls main(argc, argv)
Assembly language main programs that require normal
initialization should contain the following
PUBLIC MAIN_
MAIN_:
The PCCS.S Standard Library Page 29
The initialization code will set the SS, DS and SP registers so
that there is the largest possible stack unless the PCCL '-S'
option is used to restrict the stack size. The stack grows
towards the unitialized data area. The figure below shows the
memory layout after the initialization code has run:
+-------------------+
| Stack |
+-------------------+<- SP,BP
| |
/ Heap /
+-------------------+<- _memory()
| Un-Init Data |
+-------------------+
| Init Data |
+-------------------+<- DS,SS
| Code |
+-------------------+<- CS
| PSP |
+-------------------+
Fig. 7-1: Initial Memory Layout
The memory between the end of the uninitialized area and the
stack is not normally used by PCC or the program (unless the
program needs an inordinate amount of stack). This area is
considered to be free memory. This memory area can be accessed
directly by using the _memory() and _showsp() routines to
calculate its extent. Another way to access this memory is to
use the malloc() routine. Do not use both methods. Remember to
leave enough space for the stack to grow.
The -A option of PCCL inhibits the call to _csetup. Execution
commences with the first instruction of the first filename
specified to PCCL. On entry, the registers have the following
values:
CS Address of Code Segment. Execution starts at CS:0.
SS Address of Data Segment.
ES,DS Address of Program Segment Prefix
SP Stack size set by PCCL
The source code for _csetup is in the file ISETUP.A.
7.4. Calling Conventions
Arguments to a function are pushed on the stack, rightmost
argument first. It is the responsibility of the calling function
to clean up the stack. For example
int i;
zip(i, 6);
The PCCS.S Standard Library Page 30
would generate the following code
mov ax,6
push ax
push word i_
public zip_
call zip_
add sp,4
The word modifier is required because PCC allocates two bytes for
ints. The add sp,4 removes the two words that were pushed as
parameters to zip_. Note the PCC appended '_' on names. If
there had been no local variables defined in the function, the
clean-up code would have been
mov sp,bp
which is faster.
Data is pushed on the stack as follows:
char pushed as a word, with high-order byte set to zero
mov AL,data_
mov AH,0
push AX
int pushed as a word
unsigned
push WORD data_
long pushed with least-significant word pushed last
push WORD data_[2]
push WORD data_[0]
float Changed to double and pushed with least-significant
word pushed last
mov si,offset data_
PUBLIC _FLOADE ; load float
call _FLOADE
PUBLIC _FPUSH ; push double
call _FPUSH
double pushed with least-significant word pushed last
push WORD data_[6]
push WORD data_[4]
push WORD data_[2]
push WORD data_[0]
The PCCS.S Standard Library Page 31
struct push (sizeof(struct) + 1) >> 1 words, with least-
significant word pushed last.
mov cx,nn ; size in words
sub sp,cx ; make room on stack
mov di,sp ; target
mov si,offset data_ ; source
mov ax,ds ; setup
mov es,ax ; es
cld ; set direction up
rep movsw ; copy to stack
7.5. LIBRARY CONVENTIONS
Called functions are responsible for preserving CS, DS, SS, SP,
and BP across the function call. All other registers need not be
maintained. The usual preamble for a called function is
PUBLIC fname_
fname_:
push bp ; save old frame pointer
mov bp,sp ; establish local frame
For functions that don't return structures, parameters begin in
the local frame at [bp+4], and continue upward based on the size
of each parameter. Thus for the fragment
blip(x, y, z)
int x;
long y;
double z;
the parameters would be referenced in Assembler as
mov cx,WORD [bp+4] ; x_
mov ax,WORD [bp+6] ; lsw of y_
mov dx,WORD [bp+8] ; msw of y_
lea si,[bp+10] ; addr of z_
For functions that do return structures, [bp+4] contains a
pointer to where the structure should be returned. So if the
above fragment was
struct foo blip(x, y, z)
the parameters would be
mov cx,WORD [bp+06] ; x_
mov ax,WORD [bp+08] ; lsw of y_
mov dx,WORD [bp+10] ; msw of y_
lea si,[bp+12] ; addr of z_
The PCCS.S Standard Library Page 32
Local variables are allocated below the current frame pointer,
regardless of what the function returns, so that the fragment
{
int aa[2];
long b;
would be referenced as
sub sp,8 ; allocate space for locals
mov ax,[bp-4] ; aa_[1]
mov dx,[bp-8] ; msw b_
The standard exit sequence is
mov sp,bp ; reclaim any local space
pop bp ; old frame pointer
ret ; caller will clean up stack
Values are returned from functions as followings:
char returned in AX. char values are returned in AL
with AH
int set to zero
unsigned
long returned in DX:AX. (AX contains lsw)
double returned on floating point stack (s/w or 8087).
float
struct returned to address in [bp+4]
7.6. Disk Input/Output Routines
In this implementation of C I/O, procedures like getc() are
functions rather than macros and a file identifier FILE is simply
an integer containing the file number rather than a pointer to a
structure. This change means that read() and getc() calls may be
intermingled and there is little difference between open() and
fopen() on a file.
In UNIX there is a distinction between file and stream I/O.
Crudely stated, the functions that have 'f' as their first letter
(fopen(), fread() etc.) deal with streams, and other primitives
(open(), read() etc.) access files. These two forms of I/O are
compatible -- fopen() may be used to open a file a file and then
read() used to read it -- but it is best to use either the stream
or file primitives only for a particular file for portability.
The FILE type is defined in the stdio.h include file and is
simply an int type. This int contains the file number, the same
number returned by open() and creat(). To use the stream
routines with a file opened with the open(), merely pass the file
number.
The PCCS.S Standard Library Page 33
The stream style of I/O primitives are: fopen() to open a file,
fread(), fgets() or fgetc() [getc()] to read, fwrite(), fputs()
or fputc() [putc()] to write, fseek() to seek, fflush() to write
out internal buffers, and fclose() to close.
The file type I/O primitives are: open(), creat(), read(),
write(), lseek(), and close().
The maximum number of files that can be open at one time is
either 20, or the number specified in CONFIG.SYS, whichever is
less. See section 2.3 for details about CONFIG.SYS. New files
are creat()'d and old files are open()'d.
A closed file may be rename()'d or unlink()'d (deleted).
Three predefined file numbers may be used to read from or write
to the console. To use them, include the following defines in
the program:
#define stdin 0
#define stdout 1
#define stderr 2
7.7. Math Routines
If any of the transcendental or sqrt() functions are used,
include the file math.h or the equivalent declarations to specify
them as returning double's.
math.h includes the statement
extern int errno;
errno is set to a non-zero value: on floating point stack errors,
if an argument to a math routine is out of range, or if the
result of a math routine would under/overflow. Error codes and
names (defined in math.h) are:
30 ESTK F/P stack overflow. The most probable cause is calling
a function that returns a double without declaring it
as such to the compiler. After eight calls, the f/p
stack will be full.
33 EDOM invalid argument, i.e., sqrt(-1.0).
34 ERANGE invalid arg size, i.e., asin(2.0).
The function rerrno() is called by the floating point routines
whenever an error is detected. rerrno() prints out an
appropriate error message and calls exit(). In order to bypass
this effect, install the following function in your program
rerrno() {;} /* null function to suppress printing */
The PCCS.S Standard Library Page 34
7.8. IBM-PC Screen and Keyboard Interface
A number of functions have been written to simplify the interface
between C programs and the IBM-PC and its clones. These routines
are not in the standard PCCS.S library but are distributed in
source form in the file PCIO.A. To use these routines, they must
be assembled and bound in. For example:
A>PCCA b:pcio
A>PCCL b:blip b:pcio
See the comments in the IBM Technical Reference Manual for
details on the BIOS interface used by PCIO.
See the LIB88 chapter for details on installing PCIO.O in
PCCS.S.
7.9. Standard Library Functions
7.9.1. abs()
unsigned uval;
int y;
uval = abs(y);
abs returns |y| (absolute value).
7.9.2. atoi()
char *cp;
int ival;
ival = atoi(cp);
atoi converts the char array at cp to its corresponding int
value. The first unrecognized character terminates the
conversion.
WS is either a tab or a space. A digit is an ASCII character '0'
through '9'. [] delimit sequences that can occur zero or one
time. {} delimit sequences that can occur zero or many times.
Valid character Sequences
{WS} [-] {DIGIT}
SEE ALSO:scanf()
The PCCS.S Standard Library Page 35
NOTES: To guard against int overflow, or large unsigned values
being stored as negative integers, use atol and check that the
high-order word is the same as the high-order bit of the low-
order word.
atoi(str)
char *str; {
long val, atol();
int sign, extn;
extn = (val = atol(str)) >> 16;
sign = val & 0x8000;
if((!sign && extn != 0) || (sign && extn != -1))
overflowErr();
return val;
}
7.9.3. atof()
char *cp;
double dval;
dval = atof(cp);
atof converts the char array at cp to its corresponding double
value. The first unrecognized character terminates the
conversion.
WS is either a tab or a space. A digit is an ASCII character '0'
through '9'. E is either an ASCII 'E' or 'e'. [] delimit
sequences that can occur zero or one time. {} delimit sequences
that can occur zero or many times.
Valid character Sequences
{WS} [-] {digit} ['.'] [{digit} [E [-] {digit}]]
SEE ALSO:scanf()
7.9.4. atol()
char *cp;
long lval, atol();
lval = atol(cp);
atol converts the char array at cp to its corresponding long
value. The first unrecognized character terminates the
conversion.
The PCCS.S Standard Library Page 36
WS is either a tab or a space. A digit is an ASCII character '0'
through '9'. [] delimit sequences that can occur zero or one
time. {} delimit sequences that can occur zero or many times.
Valid character Sequences
{WS} [-] {DIGIT}
SEE ALSO:scanf()
}
7.9.5. ceil()
#include <math.h>
double dval, x;
dval = ceil(x);
ceil returns the smallest integer value not less than x.
7.9.6. chain()
char *filename, *commandTail;
chain(filename, commandTail)
chain will load and execute an arbitrary program Q filename is
the complete pathname of the program (including the .EXE or .COM
suffix). commandTail contains the arguments to the program.
chain functions like exec except that control is not returned to
the calling program. chain is in the file EXEC.O, in the
distribution. It should be bound in first to save memory since it
loads the called program immediately behind itself. For example:
A>PCCL EXEC BLIP -OBLIP
NOTE: To invoke a Batch file, or a DOS built-in command, use
COMMAND.COM with the '/c' switch as follows.
chain("\\command.com", "/cxxx");
Where xxx is one of the DOS built-in commands ( 'dir', 'copy',
Remember that two backslashes are required to insert a single
backslash in a string. Invoking COMMAND.COM with no parameters
will start another DOS shell. To return type
exit
The PCCS.S Standard Library Page 37
7.9.7. close()
int handle, stat;
stat = close(handle);
close writes any buffered data for the file fp to that file, and
closes the file. Returns -1 if fp is not open, or if an error
occurred writing the buffered data to that file.
7.9.8. creat()
int handle;
char *name;
handle = creat(name)
creat creates the file name and return an int that is used to
reference it in future file operations, or -1 if the file can't
be opened. If the file name already exists, it is deleted before
it is opened.
NOTES: creat opens a file in update mode so that after a file is
written, a program can seek to the begining of the file and read
it without closing the file and reopening it.
Any of the functions can open the console ("CON") or printer
("PRN").
7.9.9. dates()
char *buf;
dates(buf);
dates formats the string buf with the current date as "mm/dd/yy".
7.9.10. doint()
char inum;
extern unsigned _rax, _rbx, _rcx, _rdx, _rsi, _rdi,
_res, _rds;
extern char _carryf, _zerof;
_doint(inum);
_rax - _rds contain the values of the corresponding 8088 internal
registers that are loaded and saved by _doint . _carryf is the
carry flag; _zerof is the zero flag
The PCCS.S Standard Library Page 38
_doint will cause a software interrupt and may be used to call
whatever routines are available in the particular machine. If
_rds is set to -1, the current value of the DS register is used.
NOTE: The following example, on an IBM-PC, would use interrupt
10H to print the string.
extern unsigned _rax, _rbx, _rds;
extern char _carryf;
char str[] = "Hello There!!";
int i;
for (i = 0; i < sizeof(str); i++) {
_rax = (14 << 8) + str[i];
_rbx = 0;
_rds = -1;
_doint(0x10);
}
7.9.11. exec()
char *filename, *commandTail, Code;
Code = exec(filename, commandTail)
exec will load and execute an arbitrary program. Filename is the
complete pathname of the program (including the .EXE or .COM
suffix). commandTail contains the arguments to the program.
exec will return the completion code from the program or -1 if an
error occurred loading the program. exec is in the EXEC.O file
provided in the distribution.
NOTE: Completion codes are set for programs running under MS-DOS
2.0 or later versions of the operating system. If a program
exits with
exit(n);
the system ERRORLEVEL will be set to n. A program that returns
from the main function other than by exit()sets ERRORLEVEL to
zero. ERRORLEVEL can be tested with the DOS batch file IF
command. See the section under 'BATCH' in the IBM 2.xx DOS
manual for details on the IF command.
To invoke a Batch file, or a DOS built-in command, use
COMMAND.COM with the '/c' switch as follows.
exec("\\command.com", "/cxxx");
Where xxx is one of the DOS built-in commands ( 'dir', 'copy',
Remember that two backslashes are required to insert a single
backslash in a string. Invoking COMMAND.COM with no parameters
will start another DOS shell. To return type
exit
The PCCS.S Standard Library Page 39
PCC normally allocates a stack as large as possible. This is not
desirable when using exec , as little memory may be left for the
second program. The -Shhhh option of the PCCL program should be
used to reduce the size of the stack and consequently the size of
the program. Remember that the hhhh value of the option is in
hex and that it must be large enough for all parameters and
locals active at one time. An extra 0x100 (256) bytes should
also be added for any system calls.
7.9.12. exit()
char Code;
exit(Code)
exit terminates the program with completion code Code. A main()
procedure can also exit with a completion code of zero by
returning or by "falling" through the end of the procedure.
NOTE: Completion codes are set for programs running under MS-DOS
2.0 or later versions of the operating system. If a program
exits with
exit(n);
the system ERRORLEVEL will be set to n. A program that returns
from the main function other than by exit()sets ERRORLEVEL to
zero. ERRORLEVEL can be tested with the DOS batch file IF
command. See the section under 'BATCH' in the IBM 2.xx DOS
manual for details on the IF command.
7.9.13. exp()
#include <math.h>
double x, dval, exp(), exp10();
dval = exp(x);
dval = exp10(x);
exp returns the exponential function of x; exp10 returns the
base 10 exponent.
NOTE: exp returns a very large value when the result would
overflow; errno is set to ERANGE. ERANGE is defined in math.h.
The PCCS.S Standard Library Page 40
7.9.14. fabs()
#include <math.h>
double dval, x;
dval = fabs(x);
fabs returns |x| (absolute value).
7.9.15. fclose()
#include <stdio.h>
FILE *fp;
int stat;
stat = fclose(fp);
fclose writes any buffered data for the file fp to that file, and
closes the file. Returns -1 if fp is not open, or if an error
occurred writing the buffered data to that file.
7.9.16. fgetc()
#include <stdio.h>
FILE *fp;
int data;
data = fgetc(fp)
fgetc returns the next character from the file fp, or -1 if an
error, or end of file was sensed.
SEE ALSO: scanf(), fread()
7.9.17. fgets()
#include <stdio.h>
FILE *fp;
char *cp, buf[], *fgets();
int len;
cp = fgets(buf, len, fp);
fgets reads the next line, but not more than len - 1 characters
from the file fp into buf. The last character read into buf is
followed by a zero. fgets returns buf, or 0 on end of file or an
error.
SEE ALSO: fscanf(), fread()
NOTE: fgets returns the CR character.
The PCCS.S Standard Library Page 41
7.9.18. floor()
#include <math.h>
double dval, x;
dval = floor(x);
floor returns the largest integer value not greater than x.
7.9.19. fopen()
#include <stdio.h>
FILE *fp;
char *name, *method;
fp = fopen(name, method)
fopen opens the file name and returns an FILE pointer that
identifies the file in future file operations. Returns NULL
if the file can't be opened.
method is a char string having one of the following values: "r" =
open for reading,"w" = open for writing, "a" = open for append --
open for writing at end of file, or create for writing.
NOTES: fopen for read access is the same as open for update;
write access is the same as creat for the file; append causes a
seek to the end of an existing file, or the creation of a new
file as required.
Any of the functions can open the console ("CON") or printer
("PRN").
7.9.20. fputc()
#include <stdio.h>
FILE *fp;
char ch;
int data;
data = fputc(ch, fp);
fputc writes ch to the file fp. fp must have been opened
prior to the call. The functions return ch, or -1 on error.
SEE ALSO: printf(), fwrite()
The PCCS.S Standard Library Page 42
7.9.21. fputs()
#include <stdio.h>
FILE *fp;
char buf[];
int err;
err = fputs(buf, fp);
fputs copies the null terminated string buf to the file fp.
fputs returns a -1 on error.
SEE ALSO: fprintf()
NOTE: On output, linefeed ('\n') is converted to carriage return
- linefeed ('\r\n').
7.9.22. frand()
double dval;
dval = frand();
frand returns the next pseudo-random number in the range from
0.0 to 1.0.
7.9.23. fscanf()
#include <stdio.h>
FILE *fp;
char fcs[];
int num;
num = fscanf(fp, fcs [, ptr ] ... );
fscanf reads from the file fp.
Returns the number of items successfully scanned or -1 on end of
input or error.
See scanf() for a how it works.
7.9.24. getc()
#include <stdio.h>
FILE *fp;
int data;
data = getc(fp)
getc return the next character from the file fp, or -1 if an
error, or end of file was sensed.
The PCCS.S Standard Library Page 43
NOTE: getc is a function rather than the usual macro.
getchar() will hangup reading redirected input under DOS 2.X and
higher. Use getc(stdin) if the input could be redirected.
SEE ALSO: scanf(), fread()
7.9.25. getchar()
int data;
data = getchar();
getchar returns the next character from stdin, or -1 if an
error, end of file, or a CTRL-Z was found.
NOTE: getchar is a function rather than the usual macro.
getchar() will hangup reading redirected input under DOS 2.X and
higher. Use getc(stdin) if the input could be redirected.
SEE ALSO: scanf(), fread()
7.9.26. gets()
char *cp, buf[], *gets();
int len, size;
cp = gets(buf);
len = _gets(buf, size);
gets obtains a line-edited string from the console (stdin) into
buf. During input, <ESC> means backup and start over,
<BACKSPACE> means delete the previous character and <RETURN>
means end of string. <RETURN> is replaced in buf by a zero.
gets returns its argument, or 0 on end of file or an error.
_gets obtains not more than size - 1 characters from the console
into buf. Editing proceeds as with gets. _gets returns the
number of characters obtained, or 0 on end of file or an error.
SEE ALSO: fscanf(), fread()
NOTE: gets and _gets don't return the CR character
The PCCS.S Standard Library Page 44
7.9.27. getw()
#include <stdio.h>
FILE *fp;
int data;
data = getw(fp)
getw returns the next int from the file fp, or -1 if an error, or
end of file was sensed.
SEE ALSO: scanf(), fread()
7.9.28. in()
char ch;
unsigned port, wd;
ch = _inb(port);
wd = _inw(port);
_inb and _inw read the byte ch and word wd, respectively, from
the indicated port.
7.9.29. index()
char *cp, *src, ch;
cp = index(src, ch);
index works on null-terminated strings. There is no test for
overflow.
index returns a pointer to the first occurance of ch in src,
or 0 if ch doesn't occur.
7.9.30. log()
#include <math.h>
double x, dval, log(), log10();
dval = log(x);
dval = log10(x);
log returns the natural logarithm of x; log10 returns the base
10 logarithm.
NOTE: log and log10 return zero when x is zero or negative;
errno is set to EDOM. EDOM is defined in math.h.
The PCCS.S Standard Library Page 45
7.9.31. lmove()
char *sp, *tp;
unsigned num, sseg, tseg;
_lmove(number, sp, sseg, tp, tseg);
_lmove moves num bytes from the 8088 physical address at
sseg:sp to tseg:tp . For example, to move the color display
frame buffer at address 0xB800:0 to a local buffer ( _showds
provides the C program data segment Q DS)
_lmove(4000, 0, 0xB800, buffer, _showds());
NOTE: _lmove takes advantage of the 8088 instructions for a
fast data move. It handles overlapping moves correctly so that
_lmove(3920, 0, 0xB800, 80, 0xB800);
will move 0xB800:3919 to 0xB800:3999, 0xB800:3918 to 0xB800:3998
etc. rather than propagating 0xB800:0.
7.9.32. longjmp()
#include <setjmp.h>
int val;
jmp_buf env;
longjmp(env, val);
jmp_buf is defined in <setjmp.h> . It creates an environment
used by setjmp for future use by longjmp . jmp_buf is defined
as
typedef char jmp_buf[6];
longjmp restores SP, BP, and return address from env and returns
val. val cannot be zero.
NOTE: env can be specified as zero, for compatibility with
previous releases. There can be only one "zero" env active at
any time.
If the environment stored in env points into an overlay area,
then the overlay that called setjmp must be resident when
longjmp is called Q if another overlay is resident, then strange
things will happen. It is best to call setjmp from the root.
The PCCS.S Standard Library Page 46
7.9.33. open()
int handle;
char *name, mode;
handle = open(name, mode)
open opens the file name and returns an int that identifies the
file in future file operations. Returns -1 if the file can't
be opened.
mode is a char having one of the following values: 0 = open for
reading, 1 = open for writing, 2 = open for update, and 3 = open
for reading (CTRLZ indicates EOF).
NOTES: Any of the functions can open the console ("CON") or
printer ("PRN").
7.9.34. os()
char inum, ival;
unsigned arg;
ival = _os(inum, arg);
_doint(inum);
dates(buf);
times(buf);
_os provides an elementary interrupt interface. Under DOS, inum
goes into AH and arg into DX, and an int 21H, is executed. The
value in AL is returned.
7.9.35. out()
char ch;
unsigned port, wd;
_outb(ch, port);
_outw(wd, port);
_outb and _outw write the byte ch and word wd, respectively, of
data out to the indicated port.
7.9.36. peek()
char ch, *sp;
unsigned sseg;
ch = _peek(sp, sseg);
_peek is used to retrieve a byte ch from the 8088 physical
address at sseg:sp .
The PCCS.S Standard Library Page 47
7.9.37. poke()
char ch, *tp;
unsigned tseg;
_poke(ch, tp, tseg);
_poke is used to store the byte ch of data to the 8088 physical
address at tseg:tp .
7.9.38. pow()
#include <math.h>
double x, y, dval, pow();
dval = pow(x, y);
pow returns x ** y.
NOTE: pow returns a very large value when the result would
overflow; errno is set to ERANGE. pow returns zero and sets
errno to EDOM when the second argument is negative and not
integral, or when both arguments are zero. EDOM and ERANGE are
defined in math.h.
7.9.39. putc()
#include <stdio.h>
FILE *fp;
char ch;
int data;
data = putc(ch, fp);
putc writes ch to the file fp . fp must have been opened prior
to the call. The functions return ch, or -1 on error.
SEE ALSO: printf(), fwrite()
7.9.40. putchar()
#include <stdio.h>
FILE *fp;
char ch;
int data;
data = putchar(ch);
putchar writes ch to stdout . Linefeed ('\n') is converted to
carriage return - linefeed ('\r\n'). Output will stop if CTRL-S
The PCCS.S Standard Library Page 48
is entered, and resume when any other key is pressed. Each
output will check for a CTRL-C entry, and terminate the program
if it was pressed. putchar returns ch , or -1 on error.
SEE ALSO: printf(), fwrite()
NOTE: putchar is a function rather than the usual macro.
7.9.41. puts()
char buf[];
int err;
err = puts(buf);
puts copies the null terminated string buf to the console
(stdout). puts returns a -1 on error.
SEE ALSO: printf()
NOTE: puts doesn't append a newline.
On output, linefeed ('\n') is converted to carriage return -
linefeed ('\r\n'). Output will stop if CTRL-S is entered, and
resume when any other key is pressed. Each output will check for
a CTRL-C entry, and terminate the program if it was pressed.
7.9.42. putw()
#include <stdio.h>
FILE *fp;
int data, w;
data = putw(w, fp);
putw writes the int w to the file fp . fp must have been
opened prior to the call. putw returns w, or -1 on error.
SEE ALSO: printf(), fwrite()
There is no way to distinguish the return from putw(-1, fp) from
an error.
7.9.43. qsort()
char array[];
int num, width, (*compare)();
qsort(array, num, width, compare);
qsort is an implementation of C. A. R. Hoare's quicker-sort
algorithm. It sorts an array of num elements, each width bytes
wide. compare is called with two arguments -- pointers to the
The PCCS.S Standard Library Page 49
two elements being compared, and returns an integer less than,
equal to, or greater than zero accordingly as the first argument
is less than, equal to, or greater than the second argument.
NOTE: The usual function for compare is strcmp(). If you are
sorting anything other than strings, the following may serve as a
model:
int compare(left, right)
int *left, *right; {
return *left - *right;
}
#define TCARD 1024
#define ISIZE sizeof(int)
int itab[TCARD];
qsort(itab, TCARD, ISIZE, compare);
Remember that int, long, float, and double values are stored with
their low-order bytes first. Thus string comparisons may not
produce the expected results.
7.9.44. rand()
int ival;
ival = rand();
rand returns the next pseudo-random number in the range from 0
to 2**15 - 1.
7.9.45. rename()
char *oldFile, *newFile;
int stat;
stat = rename(oldFile, newFile);
rename changes the file name oldFile to newFile. Under DOS 2.X
and higher, oldFile may contain a path specification. Returns -1
if oldFile is open, or if an error is detected.
7.9.46. rindex()
char *cp, *src, ch;
cp = index(src, ch);
rindex works on null-terminated strings. There is no test for
overflow.
The PCCS.S Standard Library Page 50
rindex returns a pointer to the last occurance of ch in src or 0
if ch doesn't occur.
7.9.47. scanf()
char fcs[];
int num;
num = scanf(fcs [, ptr ] ... );
scanf reads from stdin.
Returns the number of items successfully scanned.
The format control string, fcs, contains: blanks or tabs, which
match optional whitespace (blanks, tabs, newlines, formfeeds, and
vertical tabs) in the input; a non-'%' character which must
match the next character in the input, and conversion control
strings which describe the type and format of each *ptr.
Conversion control strings have the following format ([] enclose
optional entries):
%[*][width][parms]code
where: * indicates that the field should be skipped and not
assigned to a *ptr , width specifies the maximum field size in
bytes. Both parms and code are described below. The examples
have the following form:
| input string | . function call . result
Character: %[*][width]c
String: %[*][width]s
width specifies the number of characters to be read into the
array at *ptr . The default is 1. 'c' whitespace is not
skipped, 's' whitespace is.
| abc| . scanf("%3c", buf) . | a|
| abc| . scanf("%3s", buf) . |abc|
Integer: %[*][width][size]code
size equal to 'l' (lowercase 'L') specifies that *ptr point to
a long, a 'h' specifies a short int .
The PCCS.S Standard Library Page 51
code is one of: 'd' Q signed decimal format, 'u' Q unsigned
decimal format, 'o' Q unsigned octal, and 'x' Q unsigned
hexadecimal.
| FF | . scanf("%x", &hex) . 255
| 377 | . scanf("%o", &oct) . 255
| 255 | . scanf("%u", &uns) . 255
|-255 | . scanf("%ld", &lng) . -255L
Floating Point: %[*][width][size]code
size equal to 'l' (lowercase 'L') specifies that *ptr points to
a double rather than a float.
code can be either 'e', 'f', or 'g' Q they all indicate floating
point.
| 123.45 | . scanf("%f", %flt) . 123.45
| 123.45 | . scanf("%4lf%d", &d, &i) . 123.0 45
Scanset: %[*][width]scanset
scanset is specified by a sequence of characters enclosed by
brackets '[' ']'. It reads a string, including the terminating
null character. Leading whitespace is not skipped.
|123 ABC| . scanf("%[123 ]", str) . |123 |
A range of contiguous characters can be specified by the first
and last element of the range, separated by a '-'.
|123 ABC| . scanf("%[1-3 ]", str) . |123 |
If the first element of scanset is a '^', then all characters
except those specified will be read.
|123 ABC| . scanf("%[^A-C]", str) . |123 |
To specify '-' or ']' in a scanset , specify it as the first
element. Thus to read an integer, skip any interviening garbage,
and read another integer
scanf("%d%*[^-+0-9]%d", &dig1, &dig2);
The PCCS.S Standard Library Page 52
7.9.48. scr_aputs()
char *str, attr;
scr_aputs(str, attr);
scr_aputs writes string str to the display with attribute attr.
'\r' moves to the begining of the line, and '\n' moves to the
next line. Moving off the bottom line causes scrolling.
NOTE: scr_aputs is in the file PCIO.A.
7.9.49. scr_ci()
char ch;
ch = scr_ci();
scr_ci is like ci() but uses its own translation table for
command characters. It returns the next character from the input
queue.
NOTE: scr_ci is in the file PCIO.A.
7.9.50. scr_co()
char ch;
scr_co(ch);
scr_co is the same as co() -- it writes a single character out to
the screen.
NOTE: scr_co is in the file PCIO.A.
7.9.51. scr_clr()
scr_clr();
scr_clr erases the entire screen and sets the cursor to the home,
(0,0) location.
NOTE: scr_clr is in the file PCIO.A.
7.9.52. scr_clrl()
scr_clrl();
scr_clrl erases everything from the cursor location to the end of
the line.
NOTE: scr_clrl is in the file PCIO.A.
The PCCS.S Standard Library Page 53
7.9.53. scr_cls()
scr_cls();
scr_cls erases everything from the cursor location to the end of
the screen.
NOTE: scr_cls is in the file PCIO.A.
7.9.54. scr_csts()
char ch;
ch = scr_csts();
scr_csts returns the next character from the queue, or 0 if no
character is available. If a character is present, it is
equivalent to a csts() followed by a ci().
NOTE: scr_csts is in the file PCIO.A.
Function keys return a zero.
7.9.55. scr_cursoff()
scr_cursoff();
scr_cursoff turns the cursor off.
NOTE: scr_cursoff is in the file PCIO.A.
7.9.56. scr_curson()
scr_curson();
scr_curson turns the cursor on.
NOTE: scr_curson is in the file PCIO.A.
7.9.57. scr_rowcol()
int trow, tcol;
scr_rowcol(trow, tcol);
scr_rowcol moves the cursor to row trow and column tcol.
NOTE: scr_rowcol is in the file PCIO.A.
The PCCS.S Standard Library Page 54
7.9.58. scr_scdn()
scr_scdn();
scr_scdn scrolls the screen down one line, but leaves the top two
lines alone.
NOTE: scr_scdn is in the file PCIO.A.
7.9.59. scr_scrdn()
int lines, frow, fcol, trow, tcol;
scr_scrdn(lines, frow, fcol, trow, tcol);
scr_scrdn scrolls the given area down lines. The area is defined
by the character locations (frow, fcol), (trow, tcol).
NOTE: scr_scrdn is in the file PCIO.A.
7.9.60. scr_scrup()
int lines, frow, fcol, trow, tcol;
scr_scrup(lines, frow, fcol, trow, tcol);
scr_scrup scrolls the area up lines. The area is defined by the
character locations (frow, fcol), (trow, tcol).
NOTE: scr_scup is in the file PCIO.A.
7.9.61. scr_scup()
scr_scup();
scr_scup scrolls the screen up one line, but leaves the top two
lines alone.
NOTE: scr_scup is in the file PCIO.A.
7.9.62. scr_setmode()
char newMode;
scr_setmode(newMode);
scr_setmode sets the mode of the color card. newMode must be
between 0 and 6.
NOTE: scr_setmode is in the file PCIO.A.
The PCCS.S Standard Library Page 55
scr_setmode manages the following global data.
char scr_cols; /* number of character positions */
char scr_rows; /* number of lines */
char scr_mode; /* current screen mode:
0 = 40 col. BW
1 = 40 col. color
2 = 80 col. BW
3 = 80 col. color
4 = 320 x 200 color graphics
5 = 320 x 200 BW graphics
6 = 640 x 200 BW graphics
7 = 80 col. BW */
char scr_page; /* current active display page */
char scr_attr; /* current character attribute.
Normally 7 for white on black but
can be set for any attributes
see Technical Reference Manual */
7.9.63. scr_setup()
scr_setup();
scr_setup must be called prior to any of the screen routines if
the screen is currently in 80 column mode or if scr_curson with a
monochrome display is used.
NOTE: scr_setup is in the file PCIO.A.
scr_setup manages the same data as scr_setmode.
7.9.64. scr_sinp()
char ch;
ch = scr_sinp();
scr_sinp returns the character under the cursor on the screen.
NOTE: scr_sinp is in the file PCIO.A.
The PCCS.S Standard Library Page 56
7.9.65. setjmp()
#include <setjmp.h>
int val;
jmp_buf env;
val = setjmp(env);
jmp_buf is defined in <setjmp.h> . It creates an environment
used by setjmp for future use by longjmp . jmp_buf is defined
as
typedef char jmp_buf[6];
setjmp saves the current SP, BP, and return address in env. It
returns a zero.
NOTE: env can be specified as zero, for compatibility with
previous releases. There can be only one "zero" env active at
any time.
If the environment stored in env points into an overlay area,
then the overlay that called setjmp must be resident when
longjmp is called -- if another overlay is resident, then
strange things will happen. It is best to call setjmp from the
root.
setjmp's caller can tell by the returned value if control was
returned from setjmp(0), or from longjmp(!=0).
7.9.66. sqrt()
#include <math.h>
double x, dval, sqrt();
dval = sqrt(x);
sqrt returns the square root of x.
NOTE: sqrt returns zero when x is negative; errno is set to EDOM.
EDOM is defined in math.h.
7.9.67. srand()
int seed;
srand(seed);
srand sets the seed for the multiplicative congruential random
number generator to seed .
The PCCS.S Standard Library Page 57
NOTE: The initial seed for the generator is a long. srand only
sets the low order word, so the initial generator cannot be
restarted. Solution: seed the generator with your own integer
before any calls to rand or frand .
7.9.68. sscanf()
char fcs[], buf[];
num = sscanf(buf, fcs [, ptr ] ... );
sscanf reads from the string buf.
Returns the number of items successfully scanned.
See scanf() for a how it works.
7.9.69. strcat()
char *cp, *src, *dst;
cp = strcat(dst, src);
strcat works on null-terminated strings. There is no test for
overflow.
strcat appends a copy of src to the end of dst.
Returns dst .
7.9.70. strcmp()
char *s1, *s2;
int cmp;
cmp = strcmp(s1, s2);
strcmp works on null-terminated strings. There is no test for
overflow.
strcmp compares the two strings and returns +1, 0, or -1
accordingly as s1 is lexically greater than, equal to, or less
than s2.
7.9.71. strcpy()
char *cp, *src, *dst;
cp = strcpy(dst, src);
strcpy works on null-terminated strings. There is no test for
overflow.
The PCCS.S Standard Library Page 58
strcpy copies src to dst , stopping after the null byte has been
transfered.
Returns dst .
7.9.72. strlen()
char *src;
unsigned len;
len = strlen(src);
strlen works on null-terminated strings. There is no test for
overflow.
strlen returns the number of non-null characters in src.
7.9.73. strncat()
char *cp, *src, *dst;
unsigned max;
cp = strncat(dst, src, max);
strncat works on null-terminated strings. There is no test for
overflow.
strncat appends, at most, max bytes of src to the end of dst.
Returns dst .
7.9.74. strncmp()
char *s1, *s2;
int cmp;
unsigned max;
cmp = strncmp(s1, s2, max);
strncmp works on null-terminated strings. There is no test for
overflow.
strncmp compares, at most, max bytes of the two strings and
returns +1, 0, or -1 accordingly as s1 is lexically greater than,
equal to, or less than s2.
The PCCS.S Standard Library Page 59
7.9.75. strncpy()
char *cp, *src, *dst;
unsigned len;
cp = strncpy(dst, src, len);
strncpy works on null-terminated strings. There is no test for
overflow.
strncpy copies exactly len bytes, from src to dst truncating or
null-padding as required; dst may not be null-terminated if the
strlen(src) >= len.
Returns dst .
7.9.76. times()
char *buf;
times(buf);
times formats the string buf with the current time as "hh-mm-ss"
7.9.77. ungetc()
#include <stdio.h>
FILE *fp;
char ch;
int data;
data = ungetc(ch, fp)
ungetc pushes the character ch back onto the file fp. The next
call to getc or fgetc will return ch. ungetc returns ch, or -1
if it can't push the character back. fseek clears all pushed
characters. EOF (-1) can't be pushed.
7.9.78. unlink()
char *oldFile;
int stat;
stat = unlink(oldFile);
unlink deletes the file oldFile. Under DOS 2.X and higher,
oldFile may contain a path specification. Returns -1 if oldFile
doesn't exist, is open, or if an error is detected.
Messages Page 60
A. Messages
A.1. PCC Compiler Messages
A.1.1. Banner and Termination Messages
>PCC V1.2b Copyright by Mark DeSmet 1988
end of PCC 001A code 0012 data 1% utilization
OR
>PCC V1.2b Copyright by Mark DeSmet 1988
(various error messages)
Number of Warnings = 2 Number of Errors = 5
The first form of termination means the compile was successful.
The 'code' number is in hex and tells how many bytes of code were
produced. The 'data' number is similar and tells how many bytes
of data were produced. The utilization percentage is the worst
case of a number of compiler limits. If it nears 100% it usually
means that the largest procedure should be broken into smaller
procedures.
The second form means the compile failed. Error messages are
explained in the following section. If any errors were detected,
the compiler will stop trying to generate code and will stop as
soon as all the source has been read. This 'syntax check' mode
is fast and allows the programmer to correct the program with a
minimum of delay. If only warnings were detected, but no errors,
compilation will end normally and produce a .O file.
A.1.2. Messages
PCC produces four categories of messages: fatal errors, errors,
warnings and errors detected by the assembler. Fatal errors are
usually caused by I/O errors but compiler errors are also in this
category. When a fatal error is detected, the compiler will
print a message and quit. Errors are caused by syntax errors.
PCC reports all such errors and then quits. Warnings are
produced by correctable errors and the compiler continues. Since
the compiler uses PCCA as pass 3, assembler detected errors are
possible but rare. When they occur, the object module will not
be usable.
It is easy to tell the category of an error. After a fatal
error, the compiler stops without printing a termination message.
Errors and warnings have a distinctive format which includes the
word 'error' or 'warning'. Assembler errors print the assembler
line that was found offensive.
A.1.2.1. PCC Fatal Errors
Messages Page 61
The pass 2 fatal errors like 'bad expression' are compiler
errors, but the error is usually in not detecting the problem in
pass 1 and printing a reasonable message. If you get one of
these errors, please send your program to C Ware, but you can
probably find and eliminate the statement that caused the
problem. Don't be frightened by seeing these errors listed; you
will probably never see any of them.
bad expression - this indicates a compiler error. Printed by
pass 2.
bad GOTO target - attempt to goto something other than a label.
break/case/continue/default not in switch - a case or default
statement must be within a switch. A break
statement must be in a while or do..while or for
or switch. A continue statement must be in a
while or do..while or for statement.
cannot address - illegal use of '&' operator. Printed in pass
2.
cannot close <file> - the file could not be closed. An I/O
error occurred.
cannot create <file> - the named file could not be created. The
name is a temporary name or the name of the
object or assembler file. This message usually
means the drive is full (see 'T' option).
cannot open <file> - the named source or include file could not
be found.
cannot read <file> - the named file could not be read. Usually
means an I/O error was detected.
cannot unlink <file> - the temporary could not be deleted. An
I/O error occurred.
cannot write <file> - the named file could not be written. An I/O
error was detected. Usually means the disk drive
is out of space.
error in register allocation - compiler error in pass 2.
divide by zero - a constant expression evaluated to a divide by
zero. Should never happen.
function too big - a function is too big for the compiler. The
'Utilization' number reflects this limit so there
is normally plenty of warning. The solution is
to break large procedures into smaller ones.
illegal initialization for <name> - only constant expressions and
Messages Page 62
addresses plus or minus constant expressions can
be used in initialization and the initialization
must make sense. For example
int a=b+2;
this error is fatal because it is not discovered
until pass 2.
no cases - a switch must have at least one case.
no input file - PCC must be followed by the name of the source
file when invoked.
out of memory - the compiler ran out of symbol space. The
'utilization' numbers warn when a program is
about to exceed this or any other compiler limit.
The compiler can use up to 100K, so adding memory
may be a solution. If not, the only remedy is
the painful surgery required to reduce the total
number of externals and locals defined at one
time.
pushed - compiler error in pass 2 code generation. It
can be eliminated by simplifying the expression.
too many cases - currently, a switch statement can only contain
128 case statements.
too many fors/too many whiles - whiles, do-whiles, switches and
for statements can only be nested 10 deep.
stuck <register> - same as 'pushed'.
too many externals - the compiler currently has a limit of 500
static's or extern's.
A.1.2.2. PCC Errors
Errors are printed with the following format:
23 if (i < 99 $$ {
error:Need ()
Or, if the error was detected in an include file:
23 if (i < 99 $$ {
file:<include file> error:Need ()
The number preceding the source line is the line number. To find
the line , edit the file and issue the command 'nnnJ' where nnn
is the number of the reported line.
Messages Page 63
The '$$' shows how far into the line the compiler was before the
error was detected. For example, the '$$' will print immediately
BEFORE an undefined variable.
If you get a lot of errors on a compile, don't panic. A trivial
error probably caused the compiler to become confused. Correct
the first few errors and re-compile.
bad control - the # control is illegal.
bad declaration - the declaration of a variable was illegal.
bad include - the #include must be followed by "name" or
<name>.
bad label - a colon is not preceded by a label name.
bad member declare - the declaration of a member is illegal.
bad member storage - an attempt was made to declare a member
static or external. Members have the storage
type of their struct or union.
bad parameter declare - an illegal declaration of an argument or
the name of the argument was spelled differently
in the procedure heading and in the declaration.
bad statement - illegal statement.
defines too deep - #define may reference another, but there is a
limit. When #defines are expanded, the number of
active #defines plus the number of #define
arguments referenced by each cannot exceed 30.
duplicate argument - an attempt was made to declare an argument
twice.
duplicate label - two labels have the same name.
EOF within comment - end of file was found inside a comment. A
'*/' is missing.
field needs constant - the size of a bit field must be a constant
expression with a value of 1 to 16.
illegal address - attempt to use the '&' (take address of)
operator on something that is not a lvalue.
'&44' will generate this error. An address can
only be taken of a variable, procedure, string or
label.
illegal define - a #define has unmatched parenthesis or the
#define parameters are illegally specified.
Messages Page 64
illegal external declaration - caused both by an illegal data or
procedure declaration and improperly nested
braces. If the line is supposed to be part of a
procedure (e.g. i=0;), the latter is the case.
Check that every '{' outside of a comment or
quoted string has a matching '}'. Note: a prior
error may have caused the compiler to lose track
of a '{'.
illegal indirection - caused by trying to use a char, int,
unsigned, float or double as a pointer. longs
can be used as pointers but the other types
cannot.
include nesting too deep - includes can only be nested three deep
illegal use of float - floating point numbers cannot be used as
pointers.
line must be constant - a #line control must be followed by a
decimal constant.
line too long - the maximum line length is 128.
missing ";", "(", ")", "[", "]", "{", "}", ":", "|" - the
indicated "" character is needed at this point. A
multitude of errors can cause these messages.
The error might be fixed by sticking in the
indicated character where the '$$' prints, but
the item following the '$$' could be illegal.
missing ' - a character constant (e.g. 'A','TEXT') can only
contain one to four characters.
missing argument - the argument list of a call had two adjacent
commas.
missing arguments - a #define was defined with arguments but used
without arguments.
missing dimension - an array dimension was missing in an
expression or statement. Either int x[][]; or
x[]=1;.
missing end of #asm - an #asm block was not ended with a #.
missing expression - an expression is needed here. An example of
a missing expression is i=;.
missing operand - an operator without an operand was found. An
example of a missing operand is ++;
missing while - a 'do ... while' is missing the ending 'while'.
Messages Page 65
must return float - a float or double function must end with a
return statement that returns a value.
Note: The compiler is too stupid to accept.
double x(){if (1) return 1.;}.
need () - the expression following an 'if' or 'switch' or
'while' was not surrounded by parenthesis.
need '{' for STRUCT initialization - the initial values used to
initialize a structure must be surrounded by
braces.
need constant - a 'case' prefix must be followed by an integer
constant expression.
need constant after #if - a #if control must be followed by a
constant expression.
need label - a goto must reference a label.
need lval - a lvalue is needed here. An lvalue is, roughly,
something that can be changed with an assignment.
The statement: 2=4; will produce this error.
need member - the '.' or '->' operators were followed by
something other than a member name.
need structure - the name prior to a '.' operator is not the
name of a struct or union.
not an identifier - #ifdef, #ifndef and #undef controls must
reference a #define value;.
not defined - #undef controls must reference a #define
value;.
only STATIC and EXTERN allowed at this level - an attempt was
made to declare an 'auto' outside of a procedure.
parameters cannot span lines - the arguments to a #define must
all be on the same line.
return lacks argument - if a function is declared as returning a
value then "return;" is illegal. Use "return 0;"
if the value is unimportant.
sorry, must have dimension for locals - the compiler does not
accept char a[]={1,2,3}; and similar for auto
variables. Declare the variable static or
include an explicit dimension.
sorry, no string initialization of AUTO - the compiler cannot
accept char a[]="abc"; and similar for auto
Messages Page 66
variables. Declare the variable static if
possible, otherwise use _move.
string too long - a string cannot exceed 200 characters. Usually
means that a '"' is missing.
undefined structure - a pointer to an undefined structure cannot
be added to.
unknown control - the word following a '#' is not a control word.
'#while' would cause this error.
unmatched " - either the end of line or end of file was found
in a string. Usually means that a " is missing.
if your string is too long for one line, continue
with a \ (backslash) at the end of a line and
continue in column one of the next. If you want
a new line in a string, use \n.
wrong number of arguments - a #define was used with the wrong
number of arguments.
A.1.2.3. PCC Warnings
There are currently only two warnings. Warnings indicate
suspicious code that is probably OK.
conflicting types - an external or static was declared twice with
different types. Usually caused by an include
file declaring a variable incorrectly or by a
program such as:
main() {
char ch;
ch=zipit();
}
char zipit(ch)
char ch; {
return ch;
}
the call of zipit implicitly declares it to be a
function returning an integer. The line 'char
zipit(ch)' would be flagged as an error. The fix
is to include:
char zipit();
above the call so the function is declared
correctly before use.
Messages Page 67
undefined variable - the variable has not been defined. It is
assumed to be an auto int.
A.1.2.4. PCCA Errors ( from PCC Execution )
In theory, any PCCA error message can be produced by a PCC
compile gone bonkers but I have only seen the 'cannot write
<name>' errors caused by lack of disk space.
A.2. PCCA Assembler Messages
A.2.1. Banner and Termination Messages
>PCCA PCC Assembler V1.2b Copyright by Mark DeSmet 1988
(various error messages)
end of PCCA 0016 code 0000 data 1% utilization
The 'code' number is in hex and tells how many bytes of code were
produced. The 'data' number is similar and tells how many bytes
of data were produced. The utilization percentage shows how full
the symbol table was.
Sample of list output:
PCCA Assembler BLIP.A
1 ;TOUPPER.A convert a charcter to upper case
2
3 CSEG
4 PUBLIC TOUPPER
5
6 ; character = toupper(character)
7
0000 5A 8 TOUPPER:POP DX ;RETURN ADDRESS
0001 58 9 POP AX ;CHARACTER
0002 3C61 10 CMP AL,'a' ;IF LOWER THAN 'a'
11 JC TO_DONE ;DO NOTHING
0004 3C7B 12 CMP AL,'z' ;OR IF ABOVE 'z'
13 JNC TO_DONE ;DO NOTHING
0006 2C20 14 SUB AL,'a'-'A' ;ELSE ADJUST
0008 B400 15 TO_DONE:MOV AH,0 ;RETURN AN INT
000A FFE2 16 JMP DX ;RETURN
A.2.2. Messages Produced by PCCA
PCCA prints two categories of messages: fatal errors and errors.
As with PCC, the fatal errors are caused by I/O errors or
Messages Page 68
similar. Errors are simply syntax errors in using the language.
When a fatal error is detected, PCCA prints a message and stops.
An error does not stop the assembler, but it stops writing the
object module to run faster. If errors are detected, the object
module is never good.
A.2.2.1. Fatal Errors From PCCA
cannot close <file> - the file could not be closed. An I/O error
occurred.
cannot create <file> - the named file could not be created. The
name is a temporary name or the name of the
object or list file. This message usually means
the drive is full (see 'T' option).
cannot open <file> - the named source or include file could not
be found.
cannot read <file> - the named file could not be read. Usually
means an I/O error was detected.
cannot unlink <file> - the temporary file could not be deleted.
An I/O error occurred.
cannot write <file> - the named file could not be written. An I/O
error was detected. Usually means the disk drive
is out of space.
internal error in jump optimization - the assembler became
confused optimizing branches.
no input file - no filename followed the PCCA when invoked.
too many labels - only 1000 names and labels are allowed.
too many symbols - the assembler ran out of symbol space. The
source program should be broken into smaller
modules.
A.2.2.2. Errors from PCCA
Error messages have the form:
44 mov #44,a3
error: illegal mnemonic
or, if the error was found in an include file:
44 mov #44,a3
file:2:SCREEN.A error: illegal mnemonic
Messages Page 69
The messages are:
address must be in DSEG - address constants can only be in DSEG,
because constants in CSEG are not fixed up at run
time.
bad DS value - a constant expression must follow the DS.
bad include - the correct form for an include statement is:
include "filename"
bad LINE value - the line statement should be followed by a
constant.
cannot label PUBLIC - a 'public' statement cannot have a label.
data offset must be an unsigned - an attempt was made to use an
offset in a byte or long constant.
DS must have label - storage cannot be reserved without a name.
DS must be in DSEG - storage can only be reserved in DSEG.
duplicate label - the label on the line was defined previously.
equate too deep - an 'equ' may reference a prior one, but only to
a depth of four.
illegal expression - the expression had an illegal operator or is
somehow invalid.
illegal operand - an operand had a type that was not legal in
that context.
illegal reserved word - a reserved word was found in the wrong
context.
illegal ST value - the index to a floating point stack element
must be in the range 0 to 7.
incorrect type - only 'byte', 'word', 'dword', and 'tbyte', are
allowed following the colon to type a public.
impossible arithmetic - an arithmetic operation has operands
incompatible with the 8086 architecture.
example:
add word [bx], word[si]
in wrong segment - a variable or label is being defined in a
segment different than the segment of the
'public' statement. Remember that 'public'
Messages Page 70
statements must be in the correct segment,
following 'dseg' or 'cseg' as appropriate.
invalid BYTE constant - a byte constant was needed, but something
else was found.
invalid constant - the instruction needed a constant and
something else was found.
invalid DD constant - the value of a 'DD' must be a constant
expression.
invalid DW constant - the value of a 'DW' must be a constant
expression or a variable name. In the latter
case, offset is assumed. The statement:
dw offset zip
is illegal since offset is already implied. Just
use:
dw zip
invalid offset - an offset of the expression cannot be taken.
line too long - the maximum input line to PCCA is 110
characters.
mismatched types - the types of the two operands must agree.
example:
db chr
add ax,bl ;illegal
add chr,ax ;illegal
add word chr,ax ;legal
misplaced reserved word - a reserved word was found in an
expression.
missing : - the '?' operator was missing the colon part.
missing ) - mismatched parenthesis.
missing ] - mismatched braces in an address expression.
missing ':' - labels to instructions must be followed by a
colon. This message also prints when a mnemonic
is misspelled. The assembler thinks that the bad
mnemonic is a label without a colon.
missing EQU name - an equate statement lacks a name.
missing type - the memory reference needs a type. In the case
Messages Page 71
of 'public's defined elsewhere, the type can be
supplied by ':byte' or ':word' on the public
statement. In the case of anonymous references,
the 'byte' or 'word' keyword must be used.
example:
public a:byte
inc a ; illegal
inc byte a ; legal
inc es:[bx] ; illegal
inc es:word[bx] ; legal
need constant - something other than a constant expression
followed a 'ret'.
need label - a jump relative was made to something other
than a label. 'jmp's may be indirect but 'jz's
etc. can only jump to a label.
nested include - an included file may not include another.
not a label - only names can be public.
RB must have label - a 'RB' statement must have a label.
RB must be in DS - 'RB's must follow a DSEG directive as they can
only be in the data segment. 'DB's can be in the
code segment.
RW must be in DS - as above.
too many arguments - the instruction had more operands than
allowed or the last operand contains an illegal
op-code.
undefined variable <name> - the name is referred to but not
defined or listed as public.
unknown mnemonic - the mnemonic is illegal.
A.3. PCCL Messages
A.3.1. Banner and Termination Messages
PCCL Linker for PCC and PCCA V1.2b Copyright by Mark DeSmet 1988
end of PCCL 9% utilization
A.3.2. Warnings from PCCL
undefined PUBLIC - <name> - the name is referenced, but not
Messages Page 72
defined in any module. PCCL will complete and
the resulting .EXE module may execute as long as
the undefined PUBLICs are not referenced. If
they are referenced, then the result is
undefined.
A.3.3. Fatal Errors from PCCL
PCCL prints the message, prints 'PCCL abandoned' and quits.
bad argument - an argument is illegal.
bad object file<name> - the object or library file contains an
illegal record.
bad stack option - the 'S' option should be followed by one to
four hex digits.
cannot close <file> - I/O error occurred.
cannot create <file> - I/O error or disk out of room. On MS-DOS
2.0 and later, make sure that the CONFIG.SYS file
contains a FILES=20 command.
cannot open <file> - the object file could not be found. On MS-
DOS 2.0 and later, make sure that the CONFIG.SYS
file contains a FILES=20 command.
cannot read <file> - I/O error occurred.
cannot seek <file> - I/O error occurred.
cannot write <file> - I/O error or disk out of room.
different segments for - <name> - the public is declared in
different segments in different modules.
Probably both as a function and as a variable.
illegal overlay number - in the overlay options -Vnn and -Mnn,
the value nn must be between 1 and 39 in
ascending, consecutive order.
multiply defined <name> - the same public appears in two modules.
over 100 arguments - PCCL only allows 100 arguments, including
arguments in -F files.
over 64K code - a segment has over 64K of code. See the
description of PCCL overlay support.
over 64K data - the resultant program has over 64K of data.
This is not supported. You will have to move
some data to locals or use overlays.
Messages Page 73
over 300 modules - only 300 modules can be linked together. The
supplied library only contains about 60 modules.
too many filenames - there are only 2000 bytes reserved for all
filenames.
too many labels in <name> - a module in the named file had over
1000 labels.
too many total PUBLICS in <name> - symbol table has overflowed.
The named file was being read when the overflow
occurred.
Order Form Page 74
B. Order Form
Remit to: C Ware Corporation
P.O. Box 428
Paso Robles, CA 94447
PCC version 1.2b
You can also order by phone using your P.O.#, Mastercard or VISA.
(805) 239-4620, 9:00 a.m. - 4:00 p.m., PST ONLY.
____ PCC Registration .................... @ $ 30.00 ea $ ______
(includes registration software -OR-
latest version of PCC)
____ UPGRADE to the newest version ....... @ $ 8.00 ea $ ______
(includes latest version of the program diskette,
with documentation on the disk.)
Orders are normally shipped by USPS at no additional charge.
For UPS shipment, please add $3.00 $ 3.00 ea $ _____
Subtotal ______
Less Discount ______
Total $ ______
Payment by: [ ] Check [ ] MC [ ] Visa [ ] PO # ______________
Name: ___________________________________________________________
Company: ________________________________________________________
Address: ________________________________________________________
: ________________________________________________________
: ________________________________________________________
Day Phone: _______________________ Eve: _________________________
Card #: _______________________________ Exp. Date: _____________
Signature of cardholder: ________________________________________
User Comments Page 75
C. User Comments
I acquired PCC from
[ ] - Friend [ ] - Software product
[ ] - Computer Club [ ] - Computer Store
[ ] - Data Base Service [ ] - Electronic BBS
[ ] - Other - Please Specify ____________________________
We would also appreciate any input you would care to give
concerning PCC. If you have any ideas or comments that would
make PCC a better program, then please let us know.
We value your comments!
Comments and/or suggestions:
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
TABLE OF CONTENTS
T A B L E O F C O N T E N T S
1. The Legal Stuff............................................1
1.1. License...............................................2
1.2. Support Policy........................................2
1.3. DISCLAIMER............................................3
1.4. FOREIGN RESHIPMENT LIABILITY..........................3
1.5. LIMITED WARRANTY ......................................3
1.6. LIMITATIONS OF REMEDIES...............................3
1.7. General...............................................4
1.8. TRADEMARKS............................................4
1.9. ORDERING INFORMATION..................................4
1.10. Use by Educational Institutions......................5
1.11. Corporate, Business, Government and Commercial Use...5
2. Preface....................................................7
3. An Introduction To PCC.....................................8
3.1. Using Text, Book, Magazine or Download source code....8
3.2. Getting Started.......................................9
3.3. PCC Files.............................................9
3.4. Basic System.........................................10
3.5. Setting Up DOS 2.xx, 3.xx, ..........................10
3.6. RAM DISK.............................................11
3.7. Completion Codes.....................................11
4. PCC -- The Personal C Compiler............................13
4.1. Introduction.........................................13
4.2. Examples.............................................14
4.3. The C Language.......................................15
4.3.1. Preprocessor directives.......................15
4.3.2. Data Types....................................15
4.4. Extensions...........................................16
4.4.1. Forward References............................18
4.4.2. Externs.......................................18
4.4.3. Macros........................................20
4.4.4. Strings.......................................20
5. The PCCA 8088 Assembler...................................21
5.1. Introduction.........................................21
5.2. Invocation...........................................21
5.3. Example..............................................21
6. The PCCL Object File Linker...............................23
6.1. Introduction.........................................23
6.2. Invocation...........................................23
6.3. Examples.............................................24
6.4. Space Considerations.................................25
6.5. Overlays.............................................25
6.6. Libraries............................................27
TABLE OF CONTENTS
7. The PCCS.S Standard Library...............................28
7.1. Introduction.........................................28
7.2. Names................................................28
7.3. Program Initialization...............................28
7.4. Calling Conventions..................................29
7.5. LIBRARY CONVENTIONS..................................31
7.6. Disk Input/Output Routines...........................32
7.7. Math Routines........................................33
7.8. IBM-PC Screen and Keyboard Interface.................34
7.9. Standard Library Functions...........................34
7.9.1. abs().........................................34
7.9.2. atoi()........................................34
7.9.3. atof()........................................35
7.9.4. atol()........................................35
7.9.5. ceil()........................................36
7.9.6. chain().......................................36
7.9.7. close().......................................37
7.9.8. creat().......................................37
7.9.9. dates().......................................37
7.9.10. doint()......................................37
7.9.11. exec().......................................38
7.9.12. exit().......................................39
7.9.13. exp()........................................39
7.9.14. fabs().......................................40
7.9.15. fclose().....................................40
7.9.16. fgetc()......................................40
7.9.17. fgets()......................................40
7.9.18. floor()......................................41
7.9.19. fopen()......................................41
7.9.20. fputc()......................................41
7.9.21. fputs()......................................42
7.9.22. frand()......................................42
7.9.23. fscanf().....................................42
7.9.24. getc().......................................42
7.9.25. getchar()....................................43
7.9.26. gets().......................................43
7.9.27. getw().......................................44
7.9.28. in().........................................44
7.9.29. index()......................................44
7.9.30. log()........................................44
7.9.31. lmove()......................................45
7.9.32. longjmp()....................................45
7.9.33. open().......................................46
7.9.34. os().........................................46
7.9.35. out()........................................46
7.9.36. peek().......................................46
7.9.37. poke().......................................47
7.9.38. pow()........................................47
7.9.39. putc().......................................47
7.9.40. putchar()....................................47
7.9.41. puts().......................................48
7.9.42. putw().......................................48
7.9.43. qsort()......................................48
7.9.44. rand().......................................49
7.9.45. rename().....................................49
TABLE OF CONTENTS
7.9.46. rindex().....................................49
7.9.47. scanf()......................................50
7.9.48. scr_aputs()..................................52
7.9.49. scr_ci().....................................52
7.9.50. scr_co().....................................52
7.9.51. scr_clr()....................................52
7.9.52. scr_clrl()...................................52
7.9.53. scr_cls()....................................53
7.9.54. scr_csts()...................................53
7.9.55. scr_cursoff()................................53
7.9.56. scr_curson().................................53
7.9.57. scr_rowcol().................................53
7.9.58. scr_scdn()...................................54
7.9.59. scr_scrdn()..................................54
7.9.60. scr_scrup()..................................54
7.9.61. scr_scup()...................................54
7.9.62. scr_setmode()................................54
7.9.63. scr_setup()..................................55
7.9.64. scr_sinp()...................................55
7.9.65. setjmp().....................................56
7.9.66. sqrt().......................................56
7.9.67. srand()......................................56
7.9.68. sscanf().....................................57
7.9.69. strcat().....................................57
7.9.70. strcmp().....................................57
7.9.71. strcpy().....................................57
7.9.72. strlen().....................................58
7.9.73. strncat()....................................58
7.9.74. strncmp()....................................58
7.9.75. strncpy()....................................59
7.9.76. times()......................................59
7.9.77. ungetc().....................................59
7.9.78. unlink().....................................59
Appendices
A. Messages..................................................60
A.1. PCC Compiler Messages................................60
A.1.1. Banner and Termination Messages...............60
A.1.2. Messages......................................60
A.1.2.1. PCC Fatal Errors.....................60
A.1.2.2. PCC Errors...........................62
A.1.2.3. PCC Warnings.........................66
A.1.2.4. PCCA Errors ( from PCC Execution )...67
A.2. PCCA Assembler Messages..............................67
A.2.1. Banner and Termination Messages...............67
A.2.2. Messages Produced by PCCA.....................67
A.2.2.1. Fatal Errors From PCCA...............68
A.2.2.2. Errors from PCCA.....................68
A.3. PCCL Messages........................................71
A.3.1. Banner and Termination Messages...............71
A.3.2. Warnings from PCCL............................71
A.3.3. Fatal Errors from PCCL .......................72
TABLE OF CONTENTS
B. Order Form................................................74
C. User Comments.............................................75
index.....................................................76
TABLE OF CONTENTS
L I S T O F F I G U R E S
7-1: Initial Memory Layout....................................29
index
A
abs(), 34
An Introduction To PCC, 8
atof(), 35
atoi(), 34
atol(), 35
B
Banner and Termination Messages, 60, 67, 71
Banner and Termination Messages:, 73
Basic System, 10
C
Calling Conventions, 29
ceil(), 36
chain(), 36
close(), 37
Completion Codes, 11
Corporate
Business, Government and Commercial Use, 5
creat(), 37
D
Data Types, 15
dates(), 37
DISCLAIMER, 3
Disk Input/Output Routines, 32
doint(), 37
E
Errors from PCCA, 68
Example, 21
Examples, 14, 24
exec(), 38
exit(), 39
exp(), 39
Extensions, 16
Externs, 18
F
fabs(), 40
Fatal Errors From PCCA, 68
Fatal Errors from PCCL, 72
fclose(), 40
fgetc(), 40
fgets(), 40
floor(), 41
fopen(), 41
FOREIGN RESHIPMENT LIABILITY, 3
Forward References, 18
fputc(), 41
fputs(), 42
frand(), 42
fscanf(), 42
G
General, 4
getc(), 42
getchar(), 43
gets(), 43
Getting Started, 9
getw(), 44
I
IBM-PC Screen and Keyboard Interface, 34
in(), 44
index(), 44
Introduction, 13, 21, 23, 28
Invocation, 21, 23
L
Libraries, 27
LIBRARY CONVENTIONS, 31
License, 2
LIMITATIONS OF REMEDIES, 3
LIMITED WARRANTY , 3
lmove(), 45
log(), 44
longjmp(), 45
M
Macros, 20
Math Routines, 33
Messages, 60
Messages Produced by PCCA, 67
N
Names, 28
O
open(), 46
Order Form, 75
ORDERING INFORMATION, 4
os(), 46
out(), 46
Overlays, 25
P
PCC -- The Personal C Compiler, 13
PCC Compiler Messages, 60
PCC Errors, 62
PCC Fatal Errors, 60
PCC Files, 9
PCC Warnings, 66
PCCA Assembler Messages, 67
PCCA Errors ( from PCC Execution ), 67
PCCL Messages, 71
peek(), 46
poke(), 47
pow(), 47
Preface, 7
Preprocessor directives, 15
Program Initialization, 28
putc(), 47
putchar(), 47
puts(), 48
putw(), 48
Q
qsort(), 48
R
RAM DISK, 11
rand(), 49
rename(), 49
rindex(), 49
S
scanf(), 50
scr_aputs(), 52
scr_ci(), 52
scr_clr(), 52
scr_clrl(), 52
scr_cls(), 53
scr_co(), 52
scr_csts(), 53
scr_cursoff(), 53
scr_curson(), 53
scr_rowcol(), 53
scr_scdn(), 54
scr_scrdn(), 54
scr_scrup(), 54
scr_scup(), 54
scr_setmode(), 54
scr_setup(), 55
scr_sinp(), 55
setjmp(), 56
Setting Up DOS 2.xx
3.xx, ..., 10
Space Considerations, 25
sqrt(), 56
srand(), 56
sscanf(), 57
Standard Library Functions, 34
strcat(), 57
strcmp(), 57
strcpy(), 57
Strings, 20
strlen(), 58
strncat(), 58
strncmp(), 58
strncpy(), 59
Support Policy, 2
T
The PCCA 8088 Assembler, 21
The PCCL Object File Linker, 23
The C Language, 15
The PCCS.S Standard Library, 28
The Legal Stuff, 1
times(), 59
TRADEMARKS, 4
U
ungetc(), 59
unlink(), 59
Use by Educational Institutions, 5
User Comments, 76
W
Warnings from PCCL, 71
U
Using Text
Book, Magazine or Download source code, 8