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. I have been writing assembler since the eighties and I know my way around this machine, but I had never coded alongside names like these before, and that was exactly the exciting bit ;)
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 something did come up, usually a corner of the framework I had not met yet, one of them would appear with an answer, and 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 somewhere in the late eighties. The Sarge drew it, I coded it, and it opens the whole story.
It works like an establishing shot. We open wide on the room, then dive into his screen for a run of mini parts, the stuff he is making, and then pull back out to the 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 the heart sequence. 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 this screenshot is only where it starts. The heart appears with the needles crossed over it. It breaks. Then the cross turns into a cog, the cog of life, the colour drains away to grey, and that hands straight over to Life Demoted, the pistons and everything else the factory has waiting for him. It is a sequence rather than a single screen, and it is the hinge of the whole demo: after this it turns dark and stays dark for the rest of disk two.
There is more going on than the still 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, the screen shakes when it breaks, and the cog turns through its own set of character maps, one per step of rotation. Sixty eight graphics assets and a couple of thousand lines of source for something that lasts seconds. Fun to build, and emotional to watch.
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 almost no one registers as a part at all. 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 that is a big multiplexed sprite overlay.
None of which was especially hard, in fairness. It is a trick I have pulled plenty of times and the framework carries a lot of the weight. The point is that disk swap screens tend to get thrown together at the end and forgotten about, and this one deserves rather more notice than it will ever get. It has to hold the mood of the demo, 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.
Ask me for my favourite thing about making Mojo and I will not name a part. I will name a weekend.
With the demo starting to look like a demo, we packed ourselves off to Copenhagen and descended on Trap's house. The excuse was work: align the running order, tighten the transitions, settle the dozen small things that had only ever been argued about in a channel. And we did all of that. But the real reason was each other. Some of us had never actually met.
Trap fed us the moment we arrived, a proper home-cooked meal in the garden, low spring sun, first beers open, everyone talking over everyone else. Then the coding sessions: laptops down both sides of the dining table, a nest of cables, a MIDI keyboard wedged in between the obligatory Coke and a very respectable quantity of beer, and the tracker running most of the weekend.
We were never short of help on Discord, that crew answers everything. But some things do not survive a chat window. Whether a transition lands, how a part actually feels, the half-formed question you cannot quite put into words yet. In person you turn the laptop round and it is settled in seconds.
One evening we hit the local pizzeria, which produced what we unanimously declared the best pizza in Copenhagen. The verdict was reached democratically, has never been appealed, and I will not be taking questions.
And that is the bit I would keep. A table full of people arguing about transitions with a beer in hand, laughing until something hurt, and a list of names in a Discord channel turning into a crew.
This is what a coding weekend actually runs on, and Trap had it sorted before any of us arrived. Crates of Coke and Fanta down the worktop, chocolate milk that went unexplained all weekend, and a kitchen sink filled to the brim with crisps, on the grounds that it was the largest container in the house and by that stage of the shopping trip the logic was unarguable.
The fizzy stuff earns its keep. At two in the morning, when a part will not exit cleanly and you have read the same twelve lines eleven times, Coke is genuinely the fuel.
It is not the whole inventory, mind. We are all past fifty and we had not been in the same room for years, so there was beer, there was a good deal of beer, and there was a line of bottles at the far end of the worktop that had nothing whatsoever to do with hydration. None of us got on a plane to Copenhagen for the Fanta.
By Sunday the sink was empty, the crates were down to the flavour that always survives, the far end of the worktop had been comprehensively dealt with, and the demo was a great deal heavier than it had been on Friday. Fair trade.
I will let Trap caption this one, since he took it:
“Front right Honcho, next to him The Syndrom and behind him Spiham. On the left front is me, next is Walt, allegedly checking his phone for special research purposes, then Mikael's purple hat, then SMC. The Sarge was sitting crying in the restroom because we had teased him too much. Or he was criticising the shop owner for the bad layout of the menus.”
That is the tone of the entire weekend in one paragraph.
The nights were a different matter.
Names have been changed to protect the innocent, though the innocent here were the rest of us. On legal advice we shall refer to him only as Sleepy.
That Sleepy snores was not news. His snoring has a reputation that travels ahead of him, the way weather warnings do. What nobody had prepared for was the output. It began somewhere around a 1541 knocking its head against track zero, worked up through two-stroke engine that will not start, and settled at a register best described as tectonic.
The Sarge had drawn the short straw and the other bed. He lasted a couple of hours. He was last seen at some small hour, pillow under one arm, wearing the expression of a man reviewing several recent life decisions, and he finished the night either on the corridor floor outside the room or out in the caravan on the plot. My memory has kindly blurred which. The Sarge's, I suspect, has not.
I had been billeted in a separate building, which is the only reason I slept through it and can write about it cheerfully rather than tearfully ;)
Sleepy slept beautifully. He always does. He turned up at breakfast refreshed, delighted with life, and entirely unaware that he had spent the night rearranging Danish geology.
We still talk about that weekend. Sleepy remains at large.
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 that the fault appeared. A demo has to work on floppies too, whatever most people happen to be running at home. And 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 to the timing that held. 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.
And if you want the closest thing to having been in that hall, Magic of Nah-Kolor filmed the whole showing and put it up. It is not the real thing, nothing is, but it is the second best option, because his camera picks up the room as well as the screen: the noise when something lands, and the applause at the end. Thank you Magic, for capturing the part of the evening none of us could have kept otherwise.
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 do not 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” ;)