Hamburg (Germany), the 27th May 1997. Written by Nils Pipenbrinck aka Submissive/Cubic & $eeN
As a demo-coder Pascal and I where faced with some big problems. If
you ever tried to write an Intro using Watcoms fine compilers you
might already noticed, that lots of space will be wasted because the
linker always included the standard libraries. Even if you don't need
the libraries the initialization code will be called and thus there
are still lots of routines in your final code which will of no
use.
This tutorial will show you how you can save some KB. I haven't ever
done a comparison, but you might be able to get more than 20k of
space.. It just depends how many libraries you can kick
The math library is the first part where you should take a look
at. If you use floating point math (I guess you will if you code for
the Pentium) you might already noticed, that you actually don't call
too much floating point routines. Mainly most of the stuff you need is
SIN, COS and SQRT. Interesting is, that you can already use the
floating point type float witout calling the library at any
time. Additions and Multiplications are inlined into your code.
Pascal write a nice headerfile with some enhanced math
functions. There are all classics like trigonometric functions and
some extra goodies. All these functions have been written as inline
pragmas. The code is available at the bottom of this document.
Some weeks ago a guy from Italy calling himself ArtNouveaU gave me a
enhanced version of the math headerfile (with some new functions...)
you can get it here.
Damn! If you write an Intro you shouldn't ever use file I/O!. You should note, that the File I/O Library takes use of the heap and the math-library. Therefore it's a good idea not to use any I/O at all. However, if you can't keep your fingers from it you should use the stuff I wrote.I wrote a couple of inline functions which allows you to do the following things:
There is absolutely no support for errorhandling. If you create a file which exists or do other things that would normally be handled strange things will happen. Even if you need File I/O it's still a good idea to use this code. If you want to display a string on the screen you can use the file-write function and pass the HSTDOUT handle to it.. This way you can communicate with the console and save a lot of space. To completely eliminate the need of standard libraries you even have no other chance.
A lot of memory can be saved if you replace the standard heap. The
standard heap works great, but it's has never been designed to be a
part of programs where space is an issue. I written a nice replacement
for the heap. It won't work with new and delete, but you can use it
instead of malloc and free. My heap doesn't do any checks. If you
corrupt it your program WILL crash.
My heap is also a little bit different. Its faster than the standard
heap (Yes!), but it needs some initialisation. Before you use it you
have to pass a memory-block and it's size. The example code privided
with the source will show you how to do it.
Now we're going into the guts of Watcom C++. Basically removing the default libraries is pretty simple. Just add this two lines to your linker-file:
OPTION NODEFAULTliBS FILE TINYSTRT.OBJ
TinyStrt is a really interesting ASM file. It initializes your
stack and defines a couple of functions which are essencial for Watcom
C++. Pascal wrote the first version for our Intro Lasse Rein Boeng and
I added some additional functions. After you linked the file the
libraries won't be initialized anymore. Therefore some library
functions will fail or even crash if you use them.
The NODEFAULTliBS option will not link the standard libraries
anymore. If you however use still library functions the linker will
give you a lot of errormessages. Eleminate them all! There might be
still a call to ABS and other functions in your code. You can be sure
not to call any standard library function if you remove all includes
of STDliB, STDIO, MATH, STRING and so on. After you've done this the
program will link and be a lot smaller.
This would be a bad tutorial without code... I promised that you can download the source. Maybe I'll also add an example program. (plan for the future). Click here to download all the stuff.
Most of the stuff you read is based on the work of Pascal. I only
added this and that function to make coding witout defaultlibs as
comforable as possible. I should also note, that the heap replacement
is a rewrite of a 16-bit code I found some years ago.. It's pure
assembler. (Hint to all the assembler coders, if you want to
experience the joys of a heap you might check out the code. It works
well under ASM.)
Pascals mxmplay player fits
perfectly into this stuff. It's a really tiny XM player for the
GUS(only).
If you have any hints, wrote other replacement functions or have problems using the stuff I presented you can of cause contact me.
© by submissive