Four disk sides, five coders, and the best three months I've had in the scene
I had just joined Pretzel Logic when Mikael asked whether I fancied taking part in something they were cooking up with Bonzai for the X party. Could I maybe do a part, or two?
Of course I wanted in. Pretzel Logic is a group with a line running back to 1988, and Bonzai are, well, Bonzai. Getting asked at all felt like a compliment I should probably not examine too closely in case somebody realised their mistake ;)
Neither of us had the faintest idea what we were agreeing to. Mojo ended up as a four disk side demo, one of the biggest C64 productions I have ever seen up close, and by the end I had fifteen parts on the credits list. Trap, who is a genuine legend and whose name is on more C64 code than I care to count, had seventeen. I still find that slightly ridiculous to write down.
Two things made a demo this size possible, and neither of them was talent on my part.
The first is the Bonzai demo framework. Walt built most of it, and it is a genuinely beautiful piece of work. It wraps lft's Spindle loader, which is the thing that makes a four side demo flow like one continuous film instead of a series of awkward pauses, and adds a set of macros and build scripts on top so that a coder can concentrate on the actual part. You copy an example folder, rename it, write your effect, run a batch file, and the emulator fires up with your part slotted into a mini build of the demo. That sounds mundane. It is not. It is the difference between a group of people making a demo and a group of people arguing about file formats for three months.
The second is the people. Walt and Trap were the master coders and they were endlessly, patiently available. When I got stuck, and I got stuck plenty, one of them would appear with an answer, usually a better answer than the question deserved. Rico, The Syndrom and everyone else on the code side were the same. Nobody guarded their tricks.
We worked on Discord for the talking and GitHub for the code. Everything lived in one repository: 802 commits between us, from Trap's first on 11 January 2023 to my last on 31 May, three days before the compo. You pulled in the morning to see what had appeared overnight, and by the end you could feel the demo getting heavier every time.
Most of my parts were built with The Sarge, and that is not an accident. We had already done five things together before Mojo, going back to No Mercy for the Trooper in 2021 and All Hallows' Eve in 2022, and I would work with him on anything.
He is a pixel master, Fairlight since 1988, and he has the quality that makes collaboration effortless: he understands what code can and cannot do. So he does not hand you a beautiful picture that is physically impossible on the machine. He hands you something that is beautiful and buildable, often as a quick mockup, and then I can go away and bring it to life. That loop is fast and it is fun.
For Mojo he did more than graphics. The idea, the storyboard, the design and the disk cover are all his, and before a line of my code existed he had made a video mockup of the whole demo. That video was the map. Every one of us was building towards a thing we had already seen, which is why a demo made by this many hands still feels like it was made by one.
If you want to understand what Mojo is about, look at this screen. A teenager in his bedroom with his back to you, posters on the wall, hunched over a breadbin. And he is not watching a demo. He is writing one. That is every one of us in about 1987. The Sarge drew it, I coded it, and it opens the whole story.
The “wide” in the part name is the camera, not the picture. This is the establishing shot. From here we dive into his screen for a run of mini parts, the stuff he is making, and then we pull back out to this same room again.
And that is where the demo plays its cruel trick. The TV starts breaking up into white noise, on and off, then one white flash, and when the picture returns he is bald, forty years older, and sitting in an office cubicle. Same person, same posture, different life. That cubicle is the one we come back to on disk three.
I started with the Lemmings part. A Pretzel Logic member had begun it and then stepped back from the scene, so somebody needed to pick it up. In practice nothing much had been done, so I started fresh. My first commit is 18 February 2023 and it is honest about its ambitions: “Added an early preview version of the Lemmings part”.
Then, on 1 March: “Now the lemmings walk :)”. Still my favourite commit message of the whole project.
March was smoke animations, the mini part Life Demoted, then Heart Locked. A run of small things where I was learning the framework as much as writing effects. The commit log from those weeks is a nice mix of progress and humility: “Doh, missed the exit to the part so now added”, “Fixed part exit, again ;)”.
One of my favourites, and there is more going on in it than the still image lets on. The heart runs as three separate character maps so it can change state, the needles and the blood are sprite animations copied in frame by frame, there are highlight overlays on top, and the whole screen shakes when it breaks.
Sixty eight graphics assets and a couple of thousand lines of source for a scene that lasts seconds. Fun to build, emotional to watch, and it is the hinge: after the heart breaks, the demo turns dark and stays there for the whole of disk two.
April is when it got serious. The factory sequence arrived and became the dark heart of the demo: pistons, then the recurring factory effects threaded through the whole of disk two, then the factory scroller. Somewhere in there is my favourite bug report, filed by me against me: “Fixed inverted sprite colours... Stupid me...”.
Then the screen I probably sweated over most. Look at it and it is a still image of a factory city with a cogwheel and a lone figure. It is not. The background is three full screens of buildings swinging side to side, driven by sine tables on the hardware scroll with the screen buffers swapping underneath, and riding over the top of all that is a big multiplexed sprite overlay. Getting the swing and the sprites to coexist without tearing was the interesting part.
It also has to sit there patiently for as long as the visitor takes to find the next disk, and pick up loading the moment it goes in. A demo is not only the effects people remember.
Two big parts went onto the final side. Psychodelica opens it, all shifting colour and delta tables, and it is the part that taught me the most about squeezing a C64. I rewrote chunks of it to generate its tables in code rather than store them, and still spent a fortnight trading animations in and out to make it fit. Then the Octahedron, a rotating solid built out of sprite frames, with a pipe effect to scroll it in, a fade to bring it up, and flares timed to fire on the music rather than on a frame counter.
And then this: the Demo Is Life logo that closes the whole thing. By the time I got to it there was, quite literally, nothing left. The disk was full. I ended up generating its sprites in code instead of storing them, purely to claw back the handful of blocks the colour cycling needed, and my commit that day records the state of the project better than I could: “0 blocks free now”.
Four disk sides, and the last thing you see was assembled out of the crumbs.
Disk three is where the story lands, and it belongs to the part that means the most to me. Not the one I am proudest of as a coder, I should be honest about that. Technically the cubicles are one of the simpler things I built on this demo. But it is the one that gets me every time I watch it.
The cubicle from earlier pulls back, and back, and you realise it is not one cubicle. It is a row of them, identical, each with the same bald man in the same chair under the same strip lights, and the camera keeps pulling out until the office is all you can see.
And then the Commando tune starts.
Of all the music in the demo, that is the piece that lands in my part, which felt like a small private joke given how much of my life the actual Commando arcade board has since eaten. But watching it with an audience, it is not a joke at all. It is the sound of the thing that kid loved, arriving forty years too late, in a room full of grey boxes. One person wrote afterwards that he felt sorry for the poor guy trying to find his friends. That is this part.
A C64 disk side does not care about your artistic vision. It has a fixed number of blocks and when they are gone, they are gone.
The last three weeks were a running negotiation with the disk. I replaced stored data with code that generates the same tables at run time, which trades a bit of speed for a lot of space. I added part preloading so scenes started instantly instead of pausing. And I took things out. My commit log has the whole sorry saga of one animation: first “Put back Smiley in Psycodelica, but had to drop spinning bubbles and star to compensate”, then a few days later “put back the spinning star animation but we can drop it again if we need the 10 blocks”, and finally, gloriously, “0 blocks free now”.
Then somebody else's part grew and we were back to arguing.
Across the parts I wrote there are roughly 23,500 lines of assembler once you strip out the data tables, spread over about a hundred source files, in 120 commits. Third most in the project after Trap and Walt. Numbers like that always flatter the person quoting them, so take them for what they are: mostly a measure of how many evenings went into it.
Then there is the one that nearly finished us off, and it was not even my part.
The screen where you turn to disk four had to run an animation while quietly waiting for the drive, and sometimes it would hang. By that stage of a project a bug is not anybody's part, it is everybody's problem, so we all went at it.
Here is why it hit us so late. All through development we tested on real hardware, but real hardware in 2023 mostly means an Ultimate II+ rather than a stack of floppies, and that is how nearly all of us were running it. On the Ultimate it was flawless, every single time, for months. It was only when we started writing actual disks and running the demo off real 1541 drives, the way it would be presented at the party, that the fault appeared. A real drive is a mechanical thing with its own timing and its own moods, and it did not like what we were doing.
So we found it late, and then it punished us for it. We could reproduce it, which sounds like good news and was not, because the only way to trigger it was to run the whole disk side, a good five minutes. Intermittent means you cannot trust a single clean run either, so after every attempted fix you had to burn a disk and run it five or six times before you had any signal at all about whether you had achieved anything. An afternoon of work buys you a handful of data points. That is what made it so exhausting: not the thinking, the waiting.
Eventually I landed on a change that held. Instead of holding the machine in a cycle exact waiting loop and demanding an exact scanline, I loosened it: hand control back properly, and wait for “at least this line” rather than “precisely this line”. It went in on 29 May labelled, with total accuracy, “TurnDisk3 'fix' for others to test”.
And then we did the only thing you can do. I ran it twenty times off real floppies, on a real drive, without a single fault. Others ran it on their machines, again and again, and none of them could break it either. The gut feeling was that it was fixed. Nobody could prove it, and to this day none of us has properly explained why that particular change made the drives behave. The real test was going to be demo day, in front of three hundred people, with no second attempt.
Two days later, on 31 May, I committed the last change in the entire project: two more faults that only appeared when loading from a real floppy. Then we stopped, because the party was on Friday.
X is held every couple of years in Someren in the Netherlands, and 2023 was the first one since 2018 because of the pandemic. Five years of pent up ambition, 301 registered visitors, and 24 demos in the C64 compo. It was never going to be a gentle evening.
Watching your own demo on that screen, in that room, is something else entirely. We loved it. You hear every reaction around you, the laughs landing where you hoped they would, the noise when an effect arrives, three hundred people reacting together to something you spent your winter on.
And then the disk flip came up, and my heart went through the roof. Twenty clean runs at home count for nothing at all in the two seconds you sit there waiting to see whether the drive picks up. It sailed through. I let out a breath I had been holding since May, grinned like an idiot, and by the time the demo ended we were high fiving each other in the dark.
Then the applause. Massive, sustained, the sort that tells you a room full of people who have seen everything have just seen something. I will not forget it.
The rest of the compo was superb. By the end it was obvious the result was a run off between three demos. I had hopes for first, of course I did. Performers took it with Next Level, and they deserved it, no argument from me. We came second, ahead of Censor Design's Wonderland XIV in third.
The numbers, which I looked up much later, make it funnier and more painful at once: Next Level averaged 9.528, Mojo 9.410, Wonderland XIV 9.288. First to second is a tenth of a point across two hundred voters. The gap from third down to fourth is five times bigger than the gap across the whole podium.
Second place at X'2023, somewhere in the small hours
Mojo sits at 9.7 on CSDb from 117 votes. One upload of it on YouTube has passed 175,000 views with 5,800 likes and 550 comments, which for a C64 demo is faintly absurd.
The part that means the most to me is that they are still arriving. Three years on, there are comments from last month sitting under comments from release week. Demos usually get their attention in the fortnight after a party and then go quiet forever. This one keeps finding people, and I do not think that happens because of the effects. It happens because of the story.
Because that is what they talk about. Not much about the code. One person wrote that he got emotional when it ended and dropped back to the BASIC screen. Somebody scanned the QR code hidden on disk two and found the heavy metal knitting video, and told everyone. Another said it made him dig his breadbin out of the loft after forty years.
The scene gave me this. I got asked into a group, and within weeks I was in a Discord channel with people whose demos I had watched as a teenager, being handed a framework built so that I could be useful on day one, and told to go and make something.
I should be honest about the price, though. They were the best three months I have had in front of a C64 since 1990, and they were also the toughest. A full time job, a family with three kids, and one of the biggest C64 demos ever attempted, all in the same calendar. Something has to give, and what gave was sleep. Those months were long nights, most of them, and by the end of May I was running on very little. I would not have swapped a single one of them, but nobody should imagine it was three months of relaxed hobby coding.
Fifteen parts, one bug that nearly did for all of us, four disk sides, second place at X, and a demo that people are still finding three years later.
And it was never mine. It belongs to all of us, so let me name everybody properly.
The Sarge, for the idea, the storyboard, the design, the graphics and the disk cover. He gave the demo its soul, and he made my job easy every single time. Mikael, for asking me in the first place, and for graphics, design and the directory art. Spiham, for graphics that made parts of this look like they belong on another machine.
Walt, for the framework that made a four side demo possible at all, and for the code. Trap, for the code, the design, and for running the whole thing without ever making it feel run. Rico and The Syndrom, for the code and the company, and The Syndrom for music on top of it.
Laxity, SMC, Xiny6581 and The Syndrom, for a soundtrack that strangers on the internet are still writing paragraphs about. And lft, whose Spindle loader is the quiet reason the whole thing flows like a film instead of four separate demos.
Not bad for “a part, or two” ;)