• Repair Log
  • Twitter
  • For Sale List
  • Shmups Forum
  • UKVAC Forum

System11 – blog

Menu
  • Repair Log
  • Twitter
  • For Sale List
  • Shmups Forum
  • UKVAC Forum
Home  /  Games • Tech / Repair  /  BeebJoy programmable joystick interface for BBC computers
05 February 2026

BeebJoy programmable joystick interface for BBC computers

Written by S11
Games, Tech / Repair Comments are off

I grew up at a time where the BBC Computer Literacy Project was in full swing. It was a joint effort between the UK government and the BBC who worked with Acorn to develop a machine aimed at educational use. The most common variant was the BBC Model B, around 80% of schools had these computers generally with the standard Cub RGB monitor. These machines were where you would be exposed to BASIC programming, word processing (Interword was a popular installed ROM), LOGO and if you were lucky ‘computer clubs’ with floppy disks full of copied games. Yes really, the teachers were the source of them.

Everyone at home tended to have ZX Spectrums, Commodore 64s, or any other of the wide variety of 8 bit home microcomputers all competing at the time. It’s impossible to really convey how widespread home computing was, with consoles being rather rare by comparison. BBC computers were very well built however and very expensive – so almost nobody had them at home. I suspect this is why the games library is very limited compared to popular home machines, and … the joystick support sucked. You could buy official joysticks, but they’re analogue and not widely supported by software.

On a wild hit of nostalgia and impulse buying, I picked up a BBC on ebay because I wanted to enjoy playing Dare Devil Dennis and Killer Gorilla again – which was fun but time has not been kind to my hands and keyboard controls are often not the most ergonomic. So after failing to find anything that would solve this, I decided to make something.

The ZX81 had a similar (even worse) problem with keyboard gaming – but there’s a “programmable” joystick interface which actually lets you assign directions to keys using jumper wires on an expansion board – so I took that concept as inspiration. As an aside I’m STILL looking for one of those ZX81 interfaces if anyone has one for sale. That said, what I’ve come up with below can probably be adapted for the ZX81 with little to no changes other than code and wiring – that’ll be the next project.

To understand the concept, the following diagram is the BBC keyboard matrix. The columns are strobed and when a key is pressed the keyboard is scanned, a fairly common setup. Nearly all home computer keyboards work in a mostly similar way electrically.

So given that what is essentially happening is we press a button and it shorts a column and row together, we could take a switch and solder it across the same points and it would do exactly the same as the key we soldered it to. An analogue switch chip can actually do the same thing – a simple CD4016 for example can connect a column and row together just like the physical switch can. Scale the theory up and an analogue crosspoint matrix can attach to all of the rows and columns at once, hijacking the entire keyboard. So I did.

I needed several things on what would become the interface PCB – a way to control the switch matrix, a way to plug a normal 9 pin Atari style joystick in, a way to program directions to keys on the fly and a way to visualise that programming – all without actually modifying the logical operation of the computer itself – it needed to be as close to physically separate as possible (aside from the whole matrix hijack thing). Then somehow this needed to be installable – I ended up designing it with multiple options in mind for that only because I wasn’t sure myself what I wanted to do and left all the doors open.

For control I went with a PICAXE chip – these are microcontrollers made by Revolution Education which use a dialect of BASIC. I’d played with them in other projects and while the language can be a bit limiting compared to something like an Arduino – the larger models have lots of IO pins and they’re simple to get started with. A MT8816 was selected as the matrix chip, one of the few 5v through hole options with a big enough matrix.

Since I wanted to make a completely onboard solution for my own install I decided to use the “ashtray” – on 99% of machines this is a perforated plastic cover in the keyboard area of the case top which you could punch out and put a serial ROM reader in. These were VERY widely vandalised by curious children, to the point where a 3D printed cover is now available – which I modified to hold an I2C display and programming button.

The PCB design was relatively simple if time consuming due to the number of tracks – on the PICAXE about 10 IO lines were needed to control the MT8816, one for the programming button and LED, a few for I2C display control and 6 for reading joystick inputs (I decided early on to support the rare 2 button joysticks). For joystick connection I simply used a 9 pin socket on the PCB and a pin header. I added a programming button, LED and a pin header for those plus the I2C 8×8 LED display.

PICAXE chips are programmed using a reset circuit and a serial jack so I put those on the back of the PCB to save space. The MT8816 had to have columns and rows connected to all the keyboard matrix column and row drivers. Actually this is where the single largest problem with the project occurred – it was put on hold for years at one point because it wouldn’t work for all keys and I parked it – one day when revisiting the problem I noticed in the datasheet that the MT8816 address lines weren’t perfectly sequential which turned into yet another PCB run to fix.

Not all BBC keyboards are physically the same – on some there’s a metal shield which makes accessing the matrix column and row chips difficult, on others these are totally exposed. I added sockets on the interface PCB so that one option was to relocate the chips from the keyboard and replace them with sockets. With the metal shield keyboards really the only option is to solder to the bottom of the keyboard PCB at the chip pins.

The end result is a PCB which you can install inside the computer (after experimenting with adhesive PCB feet a bracket was designed), or if you can find a way to extend the row and column pins outside the case (giant ribbon through the air vent for example), you could also put it in a plastic case for an external option.

A general overview of operation is that the PICAXE keeps checking the joystick inputs to see which directions are pressed, this is represented as a joystick current state and it just loops until the state changes or the programming button is pressed. Programming mode lets column and row of the keyboard matrix be selected, displaying the key in the I2C display – this is stored as a bit representation of the column and row. The MT8816 switches are turned on or off by setting the X and Y address lines to select column and row and setting the data pin to 0 or 1. When the joystick state does change (for example we pressed left or released the fire button), it sets the stored matrix positions for all inputs into the MT8816 at once by using the stored bitfields on the address lines and 0 or 1 to the DATA input. That’s literally it. The restrictive nature of the PICAXE BASIC dialect made some of this a bit tricky or uglier than it needed to be but it works, and at the end of the program code is a massive field of hex data defining the 8×8 representations of the keys.

The single worst part of the coding was where I changed the type of display I was using to one which was at 90 degrees, and all that data needed changing. I wrote a Python script to do it in the end. I used grok to help learn because I’d never used Python before, only Perl. Lots of “how do I do X in Python if I did Y in Perl?”, it was genuinely easier than reading a book.


How to build & install

There are a few ways to assemble and install this, so I’m going to document my preferred installation approach using my “nice” BBC which is a Model B with a Retroclinic Datacentre installed. Since it’s already modified I won’t have to worry too much about pushing out the ashtray cover on a perfect example. I’ll be providing parts lists, code, 3d models and so on – I only ask two things. Firstly if you do make a modified version or project based on this, please link back to the article and I’d love to see it if you tag me on X. Secondly please don’t make and sell these for profit without contacting me to discuss, I was very surprised to find one of my projects on ebay a while back.


PCB Build

PARTS LIST
1x  PICAXE 40X2
1x  Stereo PICAXE Connector
1x  6x6mm 4mm depth through hole push switch
1x  10k 0.25w 6.3mm resistor
1x  22k 0.25w 6.3mm resistor
1x  MT8816
2x  DIP40 socket
1x  4.7k Ohm 5-pin SIP resistor array
1x  10-pin 2.86mm pin header 90 degree
2x  2x8-pin 2.86mm pin header 90 degree

OPTIONAL
1x  DB9 connector THT, male (ex RS 771-8307)
1x  3mm LED
1x  74LS251
1x  7445 / 74145
2x  DIP16 socket
1x  10-pin 2.86mm pin header 90 degree

Start by fitting the PICAXE stereo connector and the pushbutton switch to the reverse side of the PCB, before soldering the outermost pins of the stereo connector, bend them in slightly. Next take one of the sockets and file or melt slight recesses into the sides as shown.

Fit this socket above the PICAXE port then populate all remaining parts. Note that depending on install approach some parts are optional – the DB9, LED and second push button are not required if fitting inside the case, the sockets and chips for the 74LS251 and 7445 are optional depending on keyboard attachment method, and the J5 10-pin header isn’t required if using the DB9. For demonstration purposes this one is being fully populated regardless.


Interface bracket build

PARTS LIST
1x  3D printed interface bracket
1x  BeebJoy interface
4x  M1.7 x 5mm pozi flanged self tapping screw
1x  No 8 x 1/2" pozi flanged self tapping screw

Fit the interface PCB to the bracket as shown, care should be taken – the holes are pre drilled but not tapped.


Ashtray panel build

PARTS LIST
1x  3D printed ashtray cover
1x  788AS 20x20mm I2C LED display
1x  APEM IRC3F492 Orange Square 16mm Momentary NO Push Button Switch Prewired
4x  M1.7 x4mm self tapping screw
6x  JST XH male crimp connector
1x  JST XHP 8-pin connector housing
4x  31cm wire lengths

The I2C module has two sets of solder points. Placing it face down with the chip oriented vertically and pin 1 at the top, use the right hand set of pins. If you get this wrong the display will be upside down which is quite annoying. The gap in the mounting points on the back of the 3D printed cover is for the soldered wire ends to protrude. Solder the wires to the module. Next fit the push button, you won’t need the rubber ring – just do the large hex nut up, it’s slightly difficult due to space but will fit. Next fit the display module and fix with 4 screws – you may need to file the corners of the 3D print a bit if the module is too tight, be careful not to mark the top surface doing so. The screws will self tap without cracking due to infill density or you could carefully pre-drill them. Bend the wires upwards from the cover to form the loom curve that will sit in the space under the ashtray and ziptie in place. Cut the switch wires to the same length as the display wires, then attach 6 crimp connectors and pin as following – note that on the PCB J4 and J5 pin order is different, the pin 1 markings are accurate.

J4 PINFUNCTIONASHTRAY PIN
1PRG switchswitch pin 1
2GNDswitch pin 2
3PRG LED
4GND
5I2C SDAdisplay SDA
6I2C SCLdisplay SCL
7VCCdisplay VCC
8GNDdisplay GND

Econet joystick loom build

PARTS LIST
1x  Lumberg 0107 08-1 8 Pin DIN Female Chassis Socket DIN 45326 Bayonet Lock Flanged
2x  M2.5 x12mm machine screw
4x  M2.5 washer
2x  M2.5 nut
8x  JST XH male crimp connector
1x  JST XHP 8-pin connector housing
8x  13cm wire lengths

Put the screws to one side. Starting with the GND wire in the middle, solder all wires to the DIN connector, then crimp and insert wires in the connector housing using the following pinout:

J5 PINFUNCTIONDIN PIN
1GND8
2VCC2
3Fire 25
4Right3
5Left1
6Down7
7Fire 14
8Up6

Econet to Joystick adapter

PARTS LIST
1x  Lumberg 0132 08-1 8 Pin DIN Male Straight Plug DIN 45326 Bayonet Cable Mount
1x  DB9 male connector housing
8x  wire lengths
1x  braided cable sheath

Use any wiring you like for this – a piece of old joystick multicore cable will be fine too. Remove the screw from the DIN connector, the pins pull out from the front. Solder the wires to the correct pins as per the pinout below starting with pin 8/GND and pinch the cable strain tabs over the wires. If wanting to build one with the braid exactly as pictured, push a section of braid through the rubber boot of the DIN connector then thread the wires into it, insert the pin assembly and replace the screw (make sure the DIN plug lock ring is on the end of the plug as the screw is what stops it moving up the cable). Fit the DB9 connector on the other end.

DIN PINFUNCTIONDB9 PIN
1Left3
2VCC7
3Right4
4Fire 16
5Fire 29
6Up1
7Down2
8GND8

Keyboard ribbons

PARTS LIST
2x  Fc Color Line 2.54 16 Pin Flat Ribbon IDC Box Header

OPTIONAL
2x  2.54mm 16-pin Pin Male Header FD IDC Socket Cable Connector 3100-16P

Depending on which revision of model B you have, you can choose whether to offboard IC2 (74LS251) and IC3 (7445) or solder ribbons directly to the underside of the chips. If offboarding they can be replaced with turned pin sockets in which case you may want to fit IDC socket connectors. Note that Most connectors have the wrong pin layout and have pins 1-8 and 9-16 on the wrong sides, pin 1 MUST match the location of pin 1 on the chip. The correct part is linked in the links section at the end of this article. Cut one ribbon cable to 95mm and the other to 268mm. J2 and J3 pinouts are below but this is just for reference as this is all a 1:1 mapping physically, it just looks different as IDC pin numbering is different to DIL numbering.

J2 PINFUNCTIONIC2 PIN (74LS251)
1ROW 31
2VCC16
3ROW 22
4ROW 415
5ROW 13
6ROW 514
7ROW 74
8ROW 613
9U3_55
10ROW 012
11U3_66
12U3_1111
13U3_77
14U3_1010
15GND8
16U3_99
J3 PINFUNCTIONIC3 PIN (7445 / 74145)
1COL 01
2VCC16
3COL 12
4U4_1515
5COL 23
6U4_1414
7COL 34
8U4_1313
9COL 45
10U4_1212
11COL 56
12COL 911
13COL 67
14COL 810
15GND8
16COL 79

Installation procedure

As mentioned this example fitting is using my already slightly modified machine with a Retroclinic Databank installed, speech chip and ADFS upgrade. There are slight differences between older units and the BBC Model B “plus”, the key difference will come down to the keyboard model mentioned earlier – the original machines have exposed chips and the plus have a metal shield in the way.

Remove the 2 screws under the front of the keyboard and the 2 on the back panel to release the top case cover. Remove case cover and the remove the screws and nuts from the left and right side of the keyboard. Unplug the large grey keyboard ribbon and remove the keyboard.

For older units the cleanest install is to remove IC2 (74LS251) and IC3 (7445) and replace them with turned pin sockets – if going with this option as mentioned earlier these chips will need to be installed on the interface board.

If you have the metal shield keyboard, more work is required – the plastic speaker shield extends around the ashtray area on the left of the keyboard. You can either break this extension off, or replace the grill entirely with a 3D printed one in the old style.

If using the older keyboard and sockets plug in the ribbons. If using the newer keyboard or wanting to leave the TTL chips on the old type keyboard turn it upside down, you will have to solder all 16 wires of each ribbon underneath the relevant chips – refer to the below photo and the wiring pinout from earlier.

On the back of the machine, push through the perforated econet cover. Take the econet joystick loom and push the DIN 8 in from the outside, use the flange holes to line up and drill a 2.5mm hole on each side. Install econet joystick loom into machine, secure with bolts washers and nuts.

Push out the perforated ashtray cover on the computer case top cover, thread ashtray panel loom through from the front, then clip assembly into place hooking in the top edge first.

Refit keyboard, grey keyboard ribbon and screws, remove the motherboard screw and fiber/plastic washer from near the econet joystick loom. Loosely install the joystick interface bracket while attaching the econet joystick loom, ashtray panel loom and both keyboard ribbon cables ensuring correct pin locations for each.

Perform an electrical safety check! Where U3 and J1 are mentioned it doesn’t matter if they haven’t been populated, just check using the correct pads or socket positions. Use a meter on continuity test for the following checks:

  • Check there is no connection between pin 8 and 16 of U3 on the joystick interface.
  • Check that pin 8 of U3 has connection to the ground pin (bottom left) of any TTL chip on the motherboard or the modulator shield.
  • Check that pin 16 of U3 connects to the 5v/VCC pin (top right) on any TTL chip.
  • Check that pin 8 on J1 connects to pin 8 on U3.
  • Check that pin 9 on J1 connects to 16 on U3.
  • Check that pin 8 of the econet joystick port connects to the GND pin on any motherboard TTL and pin 2 to 5v/VCC on any TTL chip.

If the PICAXE chip needs programming, plug the AXE027 cable into the 3.5mm port on the interface and a USB port on your computer.

Load PICAXE editor and open beebjoy-1.3.bas. Set the correct chip type and port in the top left, turn on the BBC and then click Program in the top right. If the programming fails to initiate try again and quickly press the reset button on the back of the interface. Power off BBC.

Plug a joystick into J1 or the econet joystick port adapter, turn the BBC on and push up down left right and fire, you should see ZX:/ and an error message from return being pressed. Press the programming button on the ashtray or on the chip side of the interface PCB, check that the I2C display or programming LED react to direction presses. Turn off BBC.

Use the new longer screw motherboard screw with the original fiber or plastic washer to screw down interface bracket. Replace case top cover and fit screws to bottom/rear.


Usage

Using this is significantly easier with the I2C display but the programming LED tries to feed back with flashes. The interface has no storage ability – every time the machine is power cycled it will revert to defaults which are Z X ; / and return (the controls for Killer Gorilla which inspired the entire project).

Programming example.
  1. Press the programming button on the ashtray or interface. The display will show a BBC owl symbol, the programming LED should stay lit.
  2. Press the direction or button you wish to program – the interface supports 4 directions and 2 buttons (uncommon but these sticks do exist). The display will show ESC which is row 0 column 0 of the keyboard matrix, the programming LED will go out.
  3. Using the 4 directions you can move around the logical keyboard matrix columns and rows – the display will show the key at that position (or an inverted X if the key is invalid), the programming LED will simply flash each time it changes. Press joystick button 1 to reset to 0,0 again if you get lost.
  4. When the correct key is selected press the programming button again. The display will show the BBC owl again and go out, the LED will flash and go out.

Use the below reference table for the keyboard matrix layout.

ESCf1f2f3f5f6f8f9|RIGHT ARROW
Q345f48f7=~LEFT ARROW
f0WET79I0£DOWN ARROW
12DR6UOP[UP ARROW
CAPS LOCKAXFYJK@:RETURN
SHIFT LOCKSCGHNL;]DELETE
TABZSPACEVBM,./COPY
SHIFTCTRL

Links and downloads

BeebJoy 1.3 Gerber filesDownload
beebjoy-1.3a.basDownload
BeebJoy STL modelsDownload
MT8816 datasheetDownload

Revolution Education PICAXE manuals

Revolution Education – PICAXE software (get PICAXE Editor 6.2.0, 6.2.1 patch, AXE027 driver)

BeebJoy 1.3 shared project at PCBWay

Original source of ashtray cover model by Steve Bubs

Original source of speaker grille model by Pledg

Stardot forum – Acorn computer community

S11

 Previous Article Cheetah “Sweet Talker” speech add-on for ZX81
Next Article   UniPak 2B pinout module 351B-104BD repro

Related Posts

  • UniPak 2B pinout module 351B-104BD repro

    11/04/2026
  • Nichibutsu X-Rate DVD system footage (NSFW)

    15/07/2024
  • Iskra 122 (12x?) series calculators – PCB expander / transit board

    04/01/2024
  • Arcade art scanning project
  • Galaxy Force upright project
    • Galaxy Force upright project - Introduction and donor
    • Galaxy Force upright project - Technical considerations
    • Galaxy Force upright project - Pot amplification
  • Arcade
  • Films
  • Games
  • General
  • Music
  • Personal
  • Tech / Repair
© Copyright 2023. Theme by BloomPixel.