Software Projects

This page is a partial list of software released by me. The majority of these packages are free software, though some are actually hardware designs in VHDL form. Licenses tend to be GPLv2 or BSD. In some cases the projects can also be found on my GitHub page.

2024

  • (Jan 2024) I wrote a serial to TCP connector which redirects a TCP connection via a serial port. There was already such a program shipped with pyserial but it was only suitable for telnet connections, lacking features to inform the remote side when a connection is made or broken. My program can be used to forward any TCP connection, e.g. SSH, but requires serialtcp to run at both ends of the cable.

2023

  • (Jun 2023) I built a custom alarm clock based on a Circuit Playground Express board, an I2C display module, real-time clock and a 433MHz receiver module. Because the 433MHz radio link is noisy and not secure, this involved learning how to make use of Reed-Solomon codes and HMAC. A Linux kernel module transmits the control codes to the clock from a Raspberry Pi. (Later the kernel module was replaced with the pigpio daemon.)
  • (Apr 2023) Headless Doom is a benchmark program based on Doom, and this year I revisited it in order to (1) update it for newer platforms and (2) determine exactly how it differs from the original Doom source code. I wrote a detailed list of bugs in the original code which had to be fixed in order to create a repeatable benchmark. It is now closer to the original code than before.
  • (Feb 2023) I made a Rust crate based on a data structure that I had implemented while working on an Advent of Code problem. AssociativePositionalList is a positional container in which each value is associated with an index, starting at 0 for the first element. The data structure provides the index for a value as well as the value for an index. Values can be inserted and removed at any index, and inserting a new element in the middle of the list will increment the subsequent indexes.

2022

  • (Aug 2022) I built an S/PDIF dynamic range compressor. More details here.
  • (May 2022) spdif-bit-exactness-tools is a collection of tools for testing S/PDIF outputs from a PC. More details here.
  • (Mar 2022) pairs-problem is a program that tries to determine an optimum meeting schedule for a group of N people who have to meet each other in pairs. The problem is much more difficult than it sounds, and I do not think I solved it satisfactorily.
  • (Jan 2022) spotify-pi-remote is embedded software for a Raspberry Pi which allows you to control Spotify running elsewhere via three buttons (previous track, next track, pause/play). Attached to my wife's rowing machine, allowing some music selection during a workout. Personally I am not a fan of Spotify, but at least it does have a nice developer API and it's not hard to integrate homebrew gadgets like this.

2021

  • (Dec 2021) NeoCandle is a candle simulator originally for Adafruit "NeoPixels" running on the Circuit Playground Express board. This year I ported it to Arduino Nano and Raspberry Pi, and made it work with unbranded WS2812B LEDs which are effectively the same as NeoPixels. I was particularly pleased with the RPi version because it does not require a specially-formatted SD card.
  • (Sep 2021) jdb-plus is based on the Java debugger jdb shipped with OpenJDK 11 but with some enhancements for debugging when source code is not available and within very large projects. I made this after getting frustrated with the difficulty of using Eclipse's debugger without source code. Precompiled .jar file.
  • (Mar 2021) 20,000 Light Years Into Space (15th Anniversary Edition) is a steampunk-themed strategy game where you have to manage a steam supply network. It is written in Python and runs on Windows and Linux.

2020

2017

  • (Mar 2017) ssh agent file encryption utility (safeu) is a command-line utility which works with an SSH authentication agent such as Pageant or ssh-agent. It can encrypt or decrypt files using your SSH key. It can fix up your SSH settings if you lose your connection to the agent. It can also be used to securely store passwords for other tools such as Subversion.
  • (May 2017) Reverse Polish Number Game (RPNG) is a free puzzle game for Android (and my first "app", written in a few days). To solve each puzzle, you rearrange numbers and arithmetic operations (+, -, etc.) in order to calculate a number chosen by the game. There are four difficulty levels, each with 100 number puzzles. Loosely based on the "numbers game" featured on the Countdown TV show, but using RPN in place of the conventional "infix" notation.
  • (Jul 2017) Running pace calculator is an online utility to convert running paces between one form and another. Running paces may be specified in various forms: kilometres per hour, minutes per mile, minutes per kilometre and various others. It's not straightforward to convert between these, particularly as online converters normally require you to enter pace times in fractions of a minute, e.g. 5.75 means 5 minutes 40 seconds. This calculator supports entries in minutes and seconds, and can convert between seven different ways of measuring pace.
  • (Oct 2017) notify_trello: a command-line program for moving cards on a Trello board. I use this to notify me of events at home and at work, e.g. "build completed". Blog article.
  • (Oct 2017) A patch for GNU diffutils 3.3 which ignores changes in decimal numbers, and also the hexadecimal digits 'a' .. 'f' when the -Z option is used. Blog article.

2016

  • (Jan 2016) A collection of three programs to measure the latency of the INT1 and INT3 interrupts on an x86 CPU. The programs run within Linux, Windows and on "bare metal", i.e. without an OS. This is a bootable ISO image with source code. See blog post.

2015

  • (Mar 2015) Headless Doom is a benchmark program based on Doom. Does not use the screen, keyboard, or mouse: it just determines the execution time of a demo. This will probably run on anything with a C compiler. See blog post.
  • (Apr 2015) Headless Quake 2 is the corresponding benchmark program based on Quake 2. See blog post.
  • (Jul 2015) Frotz for TempleOS is a port of the Frotz interactive fiction interpreter to Temple OS. Two related blog posts describe how to port a C program to an OS which does not have a C compiler, and I added more details on how to redirect system calls from a C library to the new host OS.
  • (Aug 2015) Lightprogram controls a programmable LED light. Made for my wife Jill's birthday. The light is controlled by an Arduino Nano and can produce any light colour: the Atmel AVR microcontroller runs a program written in the Arduino dialect of C. Lightprogram allows the colour to be set, and also makes it possible to create simple programs that produce sequences of colours. This is my first C# program, made with Visual Studio Express.
  • (Sep 2015) Final Exam is a text adventure game. I'd wanted to write one of these ever since playing some Level 9 games in the 80s. It is written in Inform 6.
  • (Dec 2015) x86determiniser version 1.0 is a "simulator" for x86 code, supporting Windows and Linux programs, with syscall emulation. Instructions are executed through a mixture of interpretation and direct execution. You can produce an instruction trace, a branch trace, count instructions, or change the behaviour of individual instructions. I made the RDTSC instruction produce an instruction count rather than a timestamp.
  • (Dec 2015) Adventure is a port of a BBC micro text adventure for Z machine. It's not related to the more famous game of the same name. It's a plain translation of a few hundred lines of BBC BASIC code.
  • (Dec 2015) Risk Assistant is a dice rolling program for Risk which automates one aspect of that game. It is an update of an earlier version written in Python, this version is written for Z machine so that it will run in the IOS version of Frotz and hence on all the Apple devices. Inform 6 source code.

2012

  • (May 2012) Static builds of various Linux utilities. Built against uclibc - very small. I didn't actually alter them, but they're useful, so they are here.
  • (May 2012) A Simplescalar VirtualBox appliance. I (used to) get requests by email for help compiling Simplescalar because I once uploaded some patches for it. I started advising people to install an old Linux distribution and compile on that. Here is an old Linux install with all of the things needed to compile Simplescalar. But beware. Simplescalar is old and not very useful, but some academics still seem to be setting homework based on it. Don't use this old simulator for research unless your research specifically concerns classic CPU designs from the 1990s and/or legacy C code.
  • (Dec 2012) Tetris Display is a device I made as a Christmas present, intended to be a bit like an electronic lava lamp (picture). It's built on a board that combines a 64x32 matrix of LEDs with a PIC microcontroller (a PIC18F46J50). The microcontroller's program is a Tetris game with a simple AI which endlessly places Tetris blocks. The AI was based on some research by an undergraduate student at the University of York, Jake Cooper, who originally developed the AI as part of a final-year project which I supervised. I used a Monte Carlo method to discover good tuning parameters for the AI, playing millions of games to completion on a PC with random AI settings.

2010

  • (Apr 2010) The SMMU project was created to experiment with replacing the cache in a CPU. This was part of my post-doctoral research. Downloads from this site include (1) hardware and software implementations of the scratchpad memory management unit, and (2) other software used to study its application to various benchmark programs.
  • (Mar 2010) Graphical Nethack - Online! is a web application allowing you to play the Roguelike adventure game "Nethack" in a web browser, with graphical tiles.

2009

  • (Feb 2009) The virtual lab project includes a great deal of software written by myself, including two servers and one shell written using C, and client libraries written using Twisted Python. It also includes a number of substantial modifications to the Linux kernel described on this page. The modified kernel is available for download.
  • (Feb 2009) Virtual Lab Interface Hardware is a component that concentrates multiple bi-directional channels into a single serial connection. This allows software to communicate with several hardware devices in a single FPGA. One of these is a debugging system for VHDL hardware designs, allowing inspection of registers, single stepping etc., via a serial cable. These components are related to the virtual lab project, but they do not require any virtual lab hardware or software.
  • (Feb 2009) Teaport is a high speed serial UART, designed for the virtual lab project. The UART is in a form that can be imported into Xilinx EDK. It interfaces to a PLBv46 bus and can be controlled by a PowerPC 405 CPU. It uses a large FIFO and allows Linux programs to send and receive serial data reliably at high speeds (several megabits per second).
  • (Sep-Nov 2009) A graphics controller for the Spartan-3E Starter Kit FPGA board. This was capable of simulating the 320x200 256 colour VGA graphics mode used by many PC games in the 1990s, even though the FPGA board could only output 8 different colours (no DAC). I upscaled to 1280x800 and then used dithering to simulate full colour, all in hardware. The palette is stored in block RAM, the frame buffer is in main (DDR) memory. Inevitably, I ported shareware Doom to the platform. It's completely playable with a keyboard (no mouse or sound). This was used for Open Day demos at the University until it was discovered that prospective students thought that Doom was a Karl Urban movie.
  • (Dec 2009) Christmas Logic is a puzzle game in which you build logic circuits to control Christmas light displays. This was made with Python, wxwidgets and py2exe and runs on Windows and Linux.

2008

  • (Jan 2008) Sound Troll locks the Windows recording input to a specified device, preventing other programs changing it. This might be useful if you have two sound cards. This program is written in C. It was last tested on Windows XP. I think it is probably only useful if some other program is helpfully resetting your sound settings, e.g. a third-party application supplied with a headset.
  • (Apr 2008) My PhD thesis includes some software, and VHDL hardware designs for a predictable CPU and its peripherals.
  • (Oct 2008) pickleserver.py is a Twisted Python module that implements a lightweight distributed computing platform for Python programs. I used it to distribute experiments to a group of machines on a LAN. It is also useful on a multi-core system: it makes it easy to run N single-threaded tasks on N cores. Its advantage over the many programs that do something similar (e.g. BOINC) is (1) good Python integration, and (2) extreme simplicitly.
  • (Dec 2008) Risk Assistant is a dice rolling program for Risk which automates one aspect of that game.

2007

  • (Nov 2007) thumbnail is a Python extension (Python + C) for Windows XP that (1) allows Python programs to generate thumbnails of documents, and (2) communicates with a Flash applet via a local connection. Wrote this for my brother as a proof of concept for some user interface research he was doing at the time.

2006

  • (Apr 2006) 20,000 Light Years Into Space is a steampunk-themed strategy game where you have to manage a steam supply network. It is written in Python and runs on Windows and Linux.
  • (Jul 2006) udg.py is a Python module that generates uDrawGraph files from Python data structures. This is useful for debugging graph algorithms. For my PhD work, I used this to visualise control flow graphs.

2005

  • (Feb 2005) Some Simplescalar patches needed to compile on more recent systems. As well as being hard to compile, Simplescalar is old and not very useful, but some academics still seem to be setting homework based on it. Don't use this old simulator for research unless your research specifically concerns classic CPU designs from the 1990s and/or legacy C code.

2004

  • (Feb 2004) The Nethack Valentine's Day 2004 Special is a game that was written as a present for Jillian. It is an extension ("mod") for Nethack. This program is written in C and runs on Linux systems.
  • (Apr 2004) The software library I wrote for my final year project as an undergraduate. This is a search engine for analogue electronic circuits (expressed in SPICE format). The project report provides all the documentation. This program was written in C and C++.
  • (Nov 2004) Snowplough is a modification of Digger. It makes Digger look all Christmassy. This program was written in C, and runs on Windows and Linux systems.

2003

  • (Mar 2003) My modular soft processor core was the first CPU I designed. This was for a third-year undergraduate project. It implements part of the M68K instruction set. It is not a very good design; not pipelined, very wasteful of FPGA space, and it could not be easily connected to other components within an FPGA as it does not support any standard bus. There is a project report.

2002

  • (Feb 2002) em180 is an emulator for the Z180/64180 microprocessor for Linux systems. It is an extension of an existing Z80 emulator; it implements most of the new Z180 instructions. This was for a second-year undergraduate project.
  • (Feb 2002) A fixed point mathematics library for the Z180/64180. This is written in Z180 assembly code and was for a second-year undergraduate project.

2001

  • (Feb 2001) minidxr2 is a DVD player program for the Creative DXR2 hardware decoder. I wrote this out of frustration with the generally poor quality of Linux-based DVD software around the turn of the century. The situation is now much improved.

Before 2000

A few surviving programs...

  • (Jul 1998) htget is a command-line tool for downloading a file via http. wget predates this project by a few months - I was not aware of wget when I wrote it - but wget has probably always had a better feature set and fewer bugs!
  • (1997) My contribution to Your Path of Destruction, a Doom-like mod for Quake, consists of two levels named "Radioactivity" and "Necromancer's Castle". I made many levels for both Doom and Quake in the years 1994-97, but most of them were terrible and remain unreleased. These two are merely quite bad. They may be launched by running Quake with the command-line options "-game ypod +map radioact" (or "+map castle"); older versions of Quake seem better for this e.g. winquake. The first is a techbase-themed level with lots of radioactive stuff and some custom textures, while the second is a hell-themed level with plenty of lava.
  • (1996) A hex editor for MSDOS written in C with the TopSpeed compiler. Runs in the 80x25 text mode, has a search function, file history and text-mode windowing. I think I wanted to replicate the classic LIST.COM program written by Vernon Buerg, but with the ability to edit as well as view, and while Doug Schaffer's FM.COM was pretty good, it always viewed files as 256-byte sectors which I did not like. Hex editors remain an essential tool for me, though I now mostly use this one.
  • (1992-1994) LISTER: Bootup menu program for launching games. This was used on the family PC in the MSDOS era to avoid needing to write instructions for launching each game. We were able to avoid the need for a boot disk for virtually all of the games because the MSDOS configuration was pretty good. This menu became increasingly elaborate, eventually incorporating submenus and search features, until the whole MSDOS thing was obsoleted by Windows 95's surprisingly powerful ability to support old MSDOS software, even when it did really stupid things (not mentioning any names, Wing Commander). The zip file includes an old example used to launch Infocom games from the Lost Treasures disc (see INFOMENU.BAT).
  • (1994) scr2ansi. Converts 80-column text-mode screen shots to ANSI escape sequences, and optionally displays them. This was useful with a program that created/edited the screenshots, which I think was a program from "Software Bottleworks" called "scode", though the screenshots just seem to be direct dumps of video memory. I cannot, however, remember more details. This is one of the few old programs that is (1) complete, and (2) has source code. Includes an instruction to my brother to NOT use cheats while playing the Aliens TC for Doom.
  • (1995) A CRC computing program for MSDOS. More TopSpeed C. Appears to be able to compute the CRC for multiple files.
  • (1994) empty.com, getch.com. MSDOS programs to flush the keyboard buffer and get a key press. Both early forays into assembly programming.
  • (1994) amulet.zip is an incomplete roguelike game for MSDOS with graphical tiles (screenshots: 2 3 4 5). There is an animation editor (designa.exe), a level editor (leveldit.exe) and a program for setting attributes of items within levels (levelmas.exe). These use crude MSDOS-based graphical interfaces, built by hand without a GUI toolkit. The game itself is only a skeleton, with just one program to play levels (playlev.exe). The dungeon does not have any monsters yet, though the level editor can add them. 32 levels were created but they're just prototypes. These programs were written in TopSpeed C using the Fastgraph library.