Sendiri logo

Free Software and Other Developments

Relocatable Module Linker (Mixed-mode)

Linker for efficient mixed-mode (eg. C and ARM assembler) relocatable RAM-based RISC OS modules. This is a bespoke linker designed to work with the output from the Norcroft translators (CC and ObjAsm) and to produce a soft-loadable relocatable module that uses the minimal amount of memory and procedure entry/exit instructions, to overcome the ugliness of C-based modules that employ the SharedCLibrary. A subset of the ISO C standard library is also included, with optimisations for the ARMv5+ instruction set/pipeline architectures.

NetSurf logo

I also do some work on an open source web browser called NetSurf which is my primary browser on my RISC OS machines and provides good performance on ARM processors, with a lovely user interface. NetSurf can be obtained for your RISC OS machine, amongst other targets, for free. Whilst it currently still lacks some support for some web standards I find that it renders most of the webpages I access, and is improving all the time.

It has, in my opinion, by far the best user interface - and is certainly the most RISC OS Style Guide compliant - of any web browser that I've used.

PicoDrive port

Following Jeffrey Lee's porting of PicoDrive (a Sega MegaDrive emulator) to the RISC OS platform, I did some work to tune and improve the code, implement multitasking, full screen operation, keyboard and joystick input, audio output, ARMv4 support etc etc.... The port has a home page, but I'm also hosting it myself for anybody who wants it because that site has had problems in the past.

RPCEmu port

First screenshot of an emulated RiscPC running RISC OS 4.02 on my IYONIX pc, courtesy of a crude initial port of Tom Walker's RPCemu.

VNC server

I keep the latest alpha-quality (at best) release of my VNC server for RISC OS here. It is, as of March 2010, being updated fairly regularly and is just about usable, although you'll have to exercise some patience. It's presently very memory hungry (about 30MB), rather slow, and not yet stable. You have been warned! That said, it's more usable for me than any of the servers I've previously tried on RISC OS.


This compressed archive format is becoming increasingly popular on the Internet. There's a quick port of the command line decompression tool 7zdec here.


A simple C program to copy all the files in one directory to another but renaming the files from 'foo.blah_c', 'foo.blah.c' or 'foo.blah/c' to 'foo.c.blah' which is the RISC OS convention for arranging source directories. I wrote this because I find SparkPlug to be the most effective tool for extracting files from downloaded TAR archives but it unfortunately seems to insist upon producing files called _c and _txt, for example.

Do not expect this program to be a complete solution to the problem of importing archives from foreign systems; no such solution can exist. I hope only that this program saves some time by doing most of the tedious work for you, as it has for me.

Screenshot of volume control

Volume Control Utility

A simple BASIC program that provides a mute button and volume slider for the speaker (left) and headphone outputs (right) because I often change these settings and it's a pain doing it through the Configure system.

(Application name not registered. Tsk!)


An extremely simple but useful module that exchanges the left and right mouse buttons so that you can more naturally (in my opinion) use the mouse with your left hand. I am pretty much ambidextrous and often find it handy to be able to put the mouse to the left of the keyboard, eg. if I'm using two computers.

Additionally, there is good evidence that using your left hand is better for preventing/mitigating musculo-skeletal problems, because your arm will be closer to the midline of your body since keyboards usually have a lot of (often superfluous/rarely used) keys on the right, such as the numeric keypad. Full source, such as it is, included.


A RISC OS module that implements the optional ARMv7 SDIV and UDIV instructions for those targets that do not implement it, via software emulation akin to the way that the FPEmulator works. This should work for all 32-bit RISC OS targets. Source and test utility included.

Coders' Corner

Coding hints, tricks and techniques that may be of interest to other programmers which I've learned/discovered over the (far too many) years that I've been writing code, with a particular emphasis upon performance optimisation.

Development tools

Sherlock and Symtab library

A diagnostic tool that provides symbolic disassemblies/memory dumps/ stack backtraces based upon the symbol tables/definitions emitted by the Norcroft linker. The intention is to aid in debugging faults in released code, where it is impossible/impractical to (repeatedly) rebuild the RISC OS Relocatable Module/application code in question to investigate the failure.

Inspired by the observed difficulty/tedium of tracking down failures induced by the relocation of 'Page Zero' in the latest RISC OS ROM images, Sherlock is a RISC OS module that aims to expedite the mapping of such failures back to the corresponding C source code. In-development builds of the Sherlock module, and in time the underlying source code and independent library, are being published here.


Performance profiling code for use (currently just on XScale cores), originally written as part of the Cino project. This code use the cycle counter built into the XScale CPU to provide very precise measurement of the amount of CPU time spent in each of a set of routines. It uses a very minimal relocatable module to access the hardware, and supplies a small library of routines to be linked into your code. Full source included.


Provides logging of textual debug information to one of a variety of destinations, including system DRAM, nVIDIA video memory and dedicated memory on a proprietary podule expansion card. Also catches and logs processor exceptions and, on the XScale CPU, provides an instruction execution trace up to the point of failure, assisting in diagnosing the cause of the failure.

Full source included.


A very simple program that protects the first 1KB of address space from USR mode reads as well as writes. This is sufficient to catch many unintentional memory reads which, whilst often harmless, can cause problems when porting software to/from other platforms and may lead to errors or failure if the program uses that data later in its execution.


A simple module - currently unregistered! - that raises the processor vectors on the IYONIX pc (a hardware feature not present on earlier machines) in an effort to reduce the chance of a program error causing a fatal machine hang by taking out the SWI and/or IRQ handlers.

This code should be regarded as experimental and I don't have it running all the time myself, at the moment. I'd suggest trying it only if you have a reproducible machine hang and need some way to debug it. Also note that it was written for the IYONIX pc (ARMv5) and is unlikely to work on later-architecture machines. Source code is included in the archive.


A short BASIC program that alters the protection of five pages of memory in the system workspace (from address 0 to &7FFF). This can be useful for catching software errors, or alternatively for allowing older, buggy/mischievous software to run on later OS versions.

Legacy software

This page provides an archive of some very old software written years ago, and is for all practical purposes 'abandonware.' There is no intent either to improve or to support it, and it is presented here purely for historical interest or curiosity. My coding style and experience has changed a lot over the intervening years as I have, I hope, learned a thing or two.

Experimental work

3D Graphics Engine

A from-scratch implementation of a 3D graphics engine (including derivation of the required mathematics), mainly geared towards architectural/modelling applications rather than games, and implemented entirely in fixed-point arithmetic (FP maths not being a strong point of older ARM-based machines). This is mostly an exercise in self-tuition at the moment, but a screenshot of the software running on the IYONIX pc and rendering an incomplete model of an house may be found by following this link.

Filtered image scaling

With the intention of improving NetSurf's rendering of resized images, I'm writing some filtered image scaling routines which I hope will be sufficiently useful that they can be used by other applications and perhaps also find a home in Geminus for transparently improving the image quality of a number of existing applications without the need to change them. Read more....

Debugger project

To learn about my ongoing efforts lifelong dream to bring a reliable, advanced debugger to the RISC OS platform, see here.

In the meantime over the past year I've returned to doing some more work on making this more usable, in the hope of having an usable tool sooner. That's an actual screen grab, not a mockup, but it's also sadly still not ready even for an alpha release; if/when it makes it there it will be uncharged but will only be suitable for programmers who are comfortable working at the assembler level.

Copyright © Adrian Lees 2003-2020