zxcc v0.4

zxcc is a wrapper for the Hi-Tech C CP/M compiler, allowing it to be used as a cross-compiler under UNIX. Version 0.4 also works with the build tools necessary to assemble CP/M 3 (MAC, RMAC, LINK, GENCOM).

New in version 4: The Digital Research linker (LINK-80) can now handle files bigger than 16k.

Setting up

Firstly, build the compiler. It should not be necessary to rebuild bios.bin; but if you have to, it assembles using the z80asm assembler, part of the z80pack emulation package which can be found on the Walnut Creek CP/M CDROM. ZXCC can also be compiled under DOS using DJGPP.

You will need the CPMIO and CPMREDIR libraries, which should be obtainable from the same place that you got ZXCC. Compile these in subdirectories of the ZXCC directory.

You will need to obtain the tools you want to use; either the Hi-Tech C compiler for CP/M <http://www.hitech.com.au> or Digital Research's tools at <http://www.mathcs.emory.edu/~cfs/cpm> Once you have obtained the tools, documentation and possibly the library source, you need to decide where to put the files. zxcc uses three directories:

The locations of these directories can be changed by editing zxcc.h.

Once you have installed zxcc and the build tools, try building Hello World:

#include <stdio.h>
void main()
{
printf("Hello World\n");
}
or for RMAC:
CSEG

LXI D,HELLO
MVI C,9
CALL 5
RST 0

HELLO: DB 'Hello World',13,10,'$'

To compile the first example, type

zxc hello.c
; if all goes well, you should end up with a file called hello.com. You can test the resulting file by typing
zxcc hello.com
.

To assemble the second example, type

zxcc rmac.com hello
zxcc link.com hello
and run it as above. NOTE: RMAC requires that lines be terminated with CR/LF. You may need to put a unix2dos command in your makefile before you invoke RMAC.

Using zxcc

For detailed instructions, see the documentation for Hi-Tech C or the CP/M tools. zxcc behaves in the same way, but note the following points:

Program names

The names of the programs have been changed between CP/M and UNIX; for example, you would type

zxc hello.c
instead of
c hello.c
. The programs to use are:
zxc
The equivalent of C.COM.
zxas
The equivalent of ZAS.COM.
zxlink
The equivalent of LINK.COM.
zxlibr
The equivalent of LIBR.COM.

All these programs work by converting their arguments to a form suitable for zxcc, and then invoking zxcc.

There are no front-end programs for the CP/M build tools; you will have to enter arguments to these in the zxcc format given below.

Filenames

Where the documentation allows you to enter a CP/M filename, you should instead enter a UNIX one. The filename itself (as opposed to any directories in its path) must obey CP/M 8.3 naming conventions and be all lowercase.

Where the documentation requires a CP/M driveletter / user number

-I2:C:
you should enter a path complete with trailing slash:
-I/usr/src/linux-80/include/

Technical

zxcc emulates a subset of CP/M 3; hopefully enough to run the Hi-Tech C compiler. It can be used as a limited general-purpose CP/M 3 emulator provided the emulated program only uses a restricted subset of system calls.

zxcc behaves like the emulator com, allowing CP/M programs to be used transparently from a UNIX prompt. However com:

Syntax for zxcc is:

zxcc comfile.com arg1 arg2 ...

The comfile is the program to run; zxcc searches the current directory and BINDIR80 for it.

The arguments are parsed in this way:

For example:

zxcc foo.com --Q -A /dev/null --I +/dev/zero +-, +/foo/bar
would pass these arguments to foo.com:
-Q A d:null -Id:zero,e:bar

The other programs are merely wrappers that convert their command lines into the form required by zxcc.

Errors

Any errors raised by the zxcc runtime system will be prefixed with zxcc:. Some errors you may encounter are:

Unsupported BDOS call
Part of CP/M 3 that the program uses has not been emulated. Add the required functionality to zxbdos.c and recompile.
Z80 encountered invalid trap
The CP/M program being run attempted to call the zxcc runtime system with an unknown call number. This will happen if the program was written for my emulator "Joyce".

Acknowledgements


John Elliott, 24 January 1999