Someone turned the Canon PowerShot SD1000 into a Doom machine

A Canon compact camera from 2007 can now run Doom. Properly. This isn’t a video playing on the screen, and it’s not a heavily modified camera packed with extra hardware. The game runs directly from an SD card on the PowerShot SD1000, also sold in Europe as the Digital IXUS 70 and in Japan as the IXY Digital 10. There’s no soldering involved. The camera’s original firmware stays in place. Remove the prepared SD card, and the camera goes back to behaving like a normal point-and-shoot. That’s what makes this port interesting. It doesn’t just prove that Doom can start. It shows how much useful computing hardware was hiding inside an ordinary digital camera all along.

A Canon compact camera from 2007 can now run Doom. Properly. This isn’t a video playing on the screen, and it’s not a heavily modified camera packed with extra hardware. The game runs directly from an SD card on the PowerShot SD1000, also sold in Europe as the Digital IXUS 70 and in Japan as the IXY Digital 10. There’s no soldering involved. The camera’s original firmware stays in place. Remove the prepared SD card, and the camera goes back to behaving like a normal point-and-shoot. That’s what makes this port interesting. It doesn’t just prove that Doom can start. It shows how much useful computing hardware was hiding inside an ordinary digital camera all along.

The camera has just enough power

The PowerShot SD1000 was a typical premium compact for its time. It has a 7.1-megapixel sensor, a 3x optical zoom lens, a 2.5-inch screen and Canon’s DIGIC III processing platform. At the centre sits an ARMv5TE processor running at around 100 MHz. That sounds painfully slow by modern standards, but Doom doesn’t need much. The original engine relies heavily on fixed-point mathematics rather than floating-point calculations, so the lack of a floating-point unit isn’t a major problem.

Memory causes more trouble. Canon’s normal software environment leaves only around 670 KB of standard heap memory available. Doom needs space for its code, data and working memory, so that limit becomes restrictive very quickly.

The solution comes from an unexpected place: the camera’s RAW image buffer. The SD1000 reserves roughly 8 MB of memory for processing photographs. When the camera runs in playback mode, it isn’t capturing images, so that buffer sits unused. The Doom port takes advantage of that space and uses it for the game’s executable, static data and memory zone. It’s a clever workaround, but it also feels completely logical once you see it.

CHDK makes the port possible

The project relies on the Canon Hack Development Kit, better known as CHDK. It runs from a bootable SD card and adds extra functions to supported Canon cameras without permanently replacing the original firmware.

CHDK provides access to the camera’s hardware, but its normal module system isn’t large enough for Doom. Standard modules are limited to roughly 100 KB, while the game binary is much bigger. So the port uses a tiny launcher module instead.

That launcher, which is only around 2 KB, loads a separate 481 KB binary into the RAW buffer. It then prepares the services Doom needs, including timing, button input, display output, file access and memory management.

Once everything is ready, the launcher clears the relevant caches and hands control over to the game. Simple in principle. Tricky in practice.

Cache handling makes the difference

The RAW buffer appears through an uncached memory address by default. Doom can run from there, but performance drops so badly that the result looks more like a slideshow than a game. Using a cached version of the same memory changes everything. The port runs several times faster once the processor can cache instructions and data properly. That turns the project from a technical demo into something you can actually play.

The developer also had to invalidate the processor’s instruction cache before starting the game. CHDK doesn’t expose the required function directly, so the port uses a low-level ARM operation instead. This is the kind of detail that decides whether an embedded port works or crashes immediately.

Doom adapts to the camera screen

The game renders at its familiar 320 by 200 resolution using an 8-bit framebuffer. Each frame then gets copied to the camera’s CHDK display overlay. Colour reproduction has limits. The SD1000 only offers a small number of reliable solid colours through that overlay system. Other palette entries use transparency or dithering, which doesn’t suit Doom’s graphics very well.

The port works around this by matching each game colour to the closest dependable camera colour. It’s not perfect. Menus and scenes with lots of colour variation make the limitation obvious. During normal gameplay, though, the image remains clear enough to follow the action. There’s no sound yet. The camera includes a Wolfson audio codec, but Canon’s audio system relies on a DMA-based interface that still needs more work. For now, Doom runs silently.

The shutter button opens doors

The camera’s controls translate surprisingly well. The directional pad handles movement and turning. Press Set to fire. The shutter button opens doors and activates switches, while a half-press makes the player run.

The zoom lever controls strafing. Menu and Display cover escape and confirmation, and the Print button exits the game and returns to CHDK. It’s an unusual layout, but it makes sense after a few minutes. The shutter button feels especially natural as an action control because your finger already rests there.

This isn’t just a novelty

The port currently targets the PowerShot SD1000 or Digital IXUS 70 running firmware version 1.02a. The camera must start in playback mode so the RAW image buffer remains available. The SD card setup also matters. Automatic CHDK booting on this generation generally requires a small card formatted with FAT16.

Those restrictions make the project fairly specific, but the underlying approach could work on other CHDK-compatible DIGIC III cameras. Each model would still need its own memory addresses, button mapping, display settings and buffer information.

The real achievement here isn’t simply that Doom runs on a camera. It’s how the port uses hardware that Canon never intended for gaming. The image buffer becomes system memory. The display overlay becomes a game screen. The shutter button becomes an action key. And somehow, it all works.

Spread the love
error: