Z80
Overview
A Z80 port is currently under development in FPC trunk:
https://svn.freepascal.org/svn/fpc/trunk
To check it out, use subversion:
mkdir fpc-z80 cd fpc-z80 svn co https://svn.freepascal.org/svn/fpc/trunk fpc
Requirements
The assembler and linker from the SDCC package are required:
Targets
Embedded
The compiler produces files in the IHX format (Intel HEX Format).
ZX Spectrum
The compiler produces ZX Spectrum tape files in the TZX file format. They are suitable for running in emulators. An open-source emulator that works is FBZX:
https://www.rastersoft.com/programas/fbzx.html
ROM images for the emulator are available here:
http://www.chiark.greenend.org.uk/~cjwatson/code/spectrum-roms/
and here:
http://www.shadowmagic.org.uk/spectrum/roms.html
They are copyrighted and are not free (as in freedom), but are legally available for use in emulators (not in real hardware), and are also repackaged and redistributed in Linux repositories such as RPMFusion - nonfree.
Another emulator that works is Fuse:
http://fuse-emulator.sourceforge.net/fuse.php
Producing TZX files requires a tool, called ihx2tzx, which is written in Pascal and is available in the utils/ihx2tzx directory of the compiler.
Building
Here's the build script I use:
#! /bin/sh set -e FPC_Z80_DIR=/home/nickysn/tralala/fpc-z80 STARTPP=fpc BINUTILSPREFIX= CROSSOPT=-O- export CROSSOPT OPT="-CX -XXs" if [ -n "$EXTRAOPT" ] then OPT+=" $EXTRAOPT" fi export OPT export CPU_TARGET=z80 export OS_TARGET=zxspectrum export OS_SOURCE=`$STARTPP -iSO` export CPU_SOURCE=`$STARTPP -iSP` cd $FPC_Z80_DIR/fpc make -j `nproc` clean PP=$STARTPP BINUTILSPREFIX=$BINUTILSPREFIX make -j `nproc` all PP=$STARTPP BINUTILSPREFIX=$BINUTILSPREFIX make -j `nproc` crossinstall PP=$FPC_Z80_DIR/fpc/compiler/ppcrossz80 INSTALL_PREFIX=$FPC_Z80_DIR/zxspectrum-snapshot BINUTILSPREFIX=$BINUTILSPREFIX
Note that, if you use the SDCC package from the official Fedora repositories, you might need to replace
BINUTILSPREFIX=
with
BINUTILSPREFIX=sdcc-
When compiling programs, you should always enable smartlinking by adding these two options to the compiler:
-CX -XX
Status
As of Apr 27, 2020, the code generator is stable enough to compile the full system unit. Standard output via write/writeln works now. Here's a simple program that works:
program Hello; var b: byte; begin Write('FPC'); for b := 0 to 255 do Write(HexStr(b, 2)); end.
Here's what this program produces in the FBZX emulator: