JJFFE Guide

JJFFE was originally created by John Jordan in an attempt to make the game playable on modern (at the time) 32bit operating systems. In an era before AI-assistance, this was a monumental effort. While being entirely unofficial and unsupported, JJFFE was responsible for both keeping the game playable in the many years between the release of FFE and Elite:Dangerous, and fixing a number of game-breaking bugs along the way.

Unfortunately John Jordan’s original site has been lost to the sands of time, but there is a partial archive that is still available (as of 2026).

For this guide I am going to assume you are going to be using JJFFE 2.8 in Windows and have DirectX installed. There are other versions but this tends to be the most common.

Getting Started

Step 1 - Getting FFE

First you need to have a copy of FFE - JJFFE is not the complete game! If you have an original copy already installed, skip this step and go to Step 2.

To get a copy of FFE, you can download the shareware version here.

Once you have completed the download, extract the zip to your c:\ drive, i.e., "c:\firstenc". Inside this directory should be 4 files and another directory (firstenc.bat, setup.bat, licence.txt, readme.txt).

Read the ReadMe and the License before continuing.

Step 2 - Getting JJFFE

Now we need to get JJFFE. There are multiple versions depending on what operating system you are using. These are the most common, but there are others on the downloads page

If you have an original FFE install (i.e., not shareware), extract the JJFFE files into c:\firstenc\.

If you are using the shareware install, extract the JJFFE files into c:\firstenc\game\.

Step 3 - Playing

Now you just need to run it! Find "ffewin28.exe" or "ffedos28.exe" and run it (not firstenc.bat). Read the warning and follow the instructions to play.

To make it full screen, press the control key ("Ctrl") and F12 together. Please note, the resolution cannot be changed.

Original Documentation

As noted, the original site has gone offline and only an archive.org partial copy still exists.

Below is some of the most salient information that may be useful or of general interest.

Which version to download?

If you’re running Windows 95/98/Me/2000/7/8/10/11 then use Win32/DirectX5 version. The Win32/SDL version is an alternative, but has no music or documentation.

If for some reason you’re running Windows NT4, you’ll need to use the Win32/DirectX3 version instead.

For DOS or DOSBox uses, the DJGPP/HMI version uses the original HMI sound code and relies on the setup.exe configuration program. The DJGPP/Allegro version should auto-configure sound, but has lower-quality MIDI and no joystick code. Other than this the versions are essentially identical - we reocmmend you start with the DJGPP/HMI version.

Note: The DJGPP/HMI version contains two additional binaries beyond setup.exe:

  • joycal16.exe: Joystick calibration file generator
  • mouseacc.exe: Mouse accelerator (for raw DOS)

If you’re running Linux, you can compile either the Linux/Allegro or Linux/SDL versions from source.

JJFFE Controls

The standard FFE key controls can be found on the Controls page.

JJFFE made some changes to the default controls listed here:

Source Code

The JJFFE source code contains the original decompiled asm code as well as the additional code that was created to support running on different systems.

The original listing from the archived copy of the JJFFE site (approx 2011) contained a useful commentary on the purpose of each file in the archive - several of the files listed here are not in the source archive that we were able to recover (notably the dos and alleg dirs are missing, as are the Dos mak files):

ffe.asm             -   Main assembler source
ffedat.asm          -   Main assembler data
ffebmp.asm          -   Missions, models and bitmaps data

ffeapi.h            -   Header for JJFFE API
ffecfg.h            -   Header for config code
ffecfg.c            -   Config code
ffemisc.c           -   Misc. C code
hmp.cpp             -   Hmp->mid conversion code

ffewin.cfg          -   Config file for DirectX versions
ffedos.cfg          -   Config file for DJGPP/HMI version
ffedosal.cfg        -   Config file for DJGPP/Allegro version
ffelnxal.cfg        -   Config file for Linux/Allegro version

jjffent4.dsp        -   MSVC project file for Win32/DirectX3 version
jjffewin.dsp        -   MSVC project file for Win32/DirectX5 version
jjffew32.dsw        -   MSVC workspace file for both projects
ffedos.mak          -   Makefile for DJGPP/HMI version
ffedal.mak          -   Makefile for DJGPP/Allegro version
ffelal.mak          -   Makefile for Linux/Allegro version

srctools/ffedis.cpp     -   Decompiler code
srctools/convdata.cpp   -   String<->hex data conversion code
srctools/bmpconv.cpp    -   BMP->data conversion code
srctools/funcloc.cpp    -   Mapfile reordering code
srctools/expbmp.cpp     -   Data->BMP conversion code
srctools/gmstruct.txt   -   Partial map of D8804 structure
srctools/plstate.txt    -   Various other structure maps
srctools/shuttle.txt    -   Some 3d model structure info
srctools/c*.txt         -   Various partially-decoded functions

dos/dosapi.c            -   Main DJGPP/HMI code
dos/dosdir.c            -   DJGPP directory code
dos/dosinp.asm          -   DJGPP/HMI low-level input code
dos/dostime.asm         -   DJGPP/HMI low-level timer code
dos/dosvid.asm          -   DJGPP/HMI low-level display code
dos/doshmi.asm          -   DJGPP/HMI low-level HMI (sound) code
dos/dossound.asm        -   DJGPP/HMI low-level sound interface code
dos/joytest.cpp         -   DOS joystick tester util code
dos/joycalib.cpp        -   DOS joystick calibrator util code
dos/maccmain.c          -   DOS mouse accelerator util code
dos/macc.asm            -   DOS mouse accelerator util low-level code

linux/linuxdir.c        -   Linux directory code
linux/lnxconv.c         -   Linux underscore conversion util code

alleg/allegsnd.c        -   Allegro sound code
alleg/allegapi.c        -   Other Allegro code

win32/win32api.h        -   DirectX internal header
win32/w32dir.cpp        -   Win32 directory code
win32/w32input.cpp      -   DirectX5 input code
win32/w32inpnt.cpp      -   DirectX3 input code
win32/w32time.cpp       -   Win32 timer code
win32/w32video.cpp      -   DirectX display code
win32/w32sound.cpp      -   DirectX sound code

sdl/sdlvideo.cpp        -   SDL display code
sdl/sdlsound.cpp        -   SDL sound code
sdl/sdlinput.cpp        -   SDL input code
sdl/sdltimer.cpp        -   SDL timer code

The following were noted as being correct versions etc at the time (approx 2011) if you are looking to recompile yourself.