Displaying QR codes on 8-bit hardware

It’s often hard to interface the world of 8-bit computing with modern digital devices. These machines don’t have USB, Wifi, Ethernet, or anything resembling a modern interface.

It’s interesting to think about ways older machines can communicate with modern devices using only hardware of the era – even if it might be kind of convoluted. One of these methods might be via QR code.

What’s a QR code?

A QR code is a two-dimensional pattern that encodes a short string of bytes or text – often a URL. These patterns can be printed on paper, or displayed on a screen. If you scan the pattern with your phone’s camera, it decodes the pattern, and displays the encoded text or URL.

How do you make QR codes?

There are many ways, but we’re going to use the my-qr.art website to generate QR codes (the qrpicture.com site also looks interesting.)

This site has a couple of neat features. Firstly, it can make QR codes as small as 25x25 pixels, which is great for 8-bit systems.

It also masks redundant regions of the QR code, allowing you to paint your own stuff in the masked area – the details are explained in this blog post. For example, I painted “8bitworkshop.com” into this 37x37 QR code:

Then the site generated this QR code:

How do you put them on 8-bit machines?

I used Dithertron to convert the QR code a 40x192 bitmap for the Atari 2600. I had to turn the Diffusion slider to 0 to avoid any dithering, and it was a little tricky to line up the crop rectangle. Then I just exported to 8bitworkshop, and the result looked like this:

The QR code just contains a shortened link to the my-qr.art website; the actual URL is stored on its server. Thus, you can encode pretty long URLs. I encoded the VCS ROM into an URL (using the “Share Playable Link” menu option) and created another QR code:

However, that QR code is different from the one displayed on the emulated VCS embedded within. I wonder if you could make them the same? This sounds almost like a hashquine, so let’s move on…

Can 8-bit machines generate QR codes on their own?

There is at least one 8-bit QR code generator already developed; here it is running on the C-64 VICE emulator:

What could we do if the 8-bit machine could make its own codes? We could broadcast data to any device watching with a camera. We could also stream data in successive packets by animating the QR code.

How much data? Let’s see – a 101 x 101 QR code holds 406 bytes, and a CRT displays 60 frames per second, so in theory about 24 KB per second.

In reality, it would be hard to generate QR codes that quickly on an 8-bit machine. The C program I linked above takes about 30 seconds to generate a single tiny (21x21) QR code, which only can contain 19 bytes.

I quickly adapted the qrtiny library so it could compile with CC65, and it ran in under 2 seconds. I would bet an optimized version would be at least twice as fast. So I estimate the plausible bandwidth of QR code video on a 1 MHz 6502 is at least 19 bytes/sec. Not great!

If you want to see the demo, it’s available on GitHub targeted for the Apple ][ using lo-res graphics.

In any case, let’s add the QR code to the list of methods by which 1970s-era devices can one-way communicate with the modern era!