Difference between revisions of "Z80"

From Free Pascal wiki
(Building: - updated script to enable smartlinking, which is now supported)
(Status: - program updated to use standard output. Produced output is intentionally the same as the previous program, in order to reuse the screenshot :))
Line 85: Line 85:
 
== Status ==
 
== Status ==
  
The code generator is not yet fully complete. The full RTL doesn't compile yet. However, simple programs like this work on the ZX Spectrum:
+
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;
 
  program Hello;
Line 91: Line 91:
 
   b: byte;
 
   b: byte;
 
  begin
 
  begin
   PrintChar('F');
+
   Write('FPC');
  PrintChar('P');
 
  PrintChar('C');
 
 
   for b := 0 to 255 do
 
   for b := 0 to 255 do
     PrintHexByte(b);
+
     Write(HexStr(b, 2));
 
  end.
 
  end.
  

Revision as of 00:23, 27 April 2020

Overview

A Z80 port is currently under development in a branch:

https://svn.freepascal.org/svn/fpc/branches/z80/

To check it out, use subversion:

mkdir fpc-z80
cd fpc-z80
svn co https://svn.freepascal.org/svn/fpc/branches/z80/ fpc

Requirements

The assembler and linker from the SDCC package are required:

http://sdcc.sourceforge.net/

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-

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:

ZX Spectrum hello world FBZX emulator screenshot.png