Recently I attended the 10th Parallels VIPP Summit in Malta, which also marked 10 years of the VIPP program. VIPP stands for Very Important Parallels Professional: a group of IT professionals and community contributors in end-user computing (EUC) who give Parallels feedback on its products and strategy. Members meet with the product teams during the year, get early access to new releases, and come together once a year at the summit.

The VIPP demo: the gun fires at the “10” above the VIPP logo
The VIPP demo running in the emulator

I’ve been a member since 2016, so this year I received a certificate for 10 years of membership.

VIPP certificate of membership for Remko Weijnen: VIPP Membership, 10 years or over, gold membership tier, member since 2016
My VIPP certificate: 10 years of membership

The summit was well organised, and it was refreshing to see again that a vendor is genuinely interested in our feedback and actively engages with us. Christa Quarles, the CEO of Parallels, being there in person underlined that.

Compliments to Christian Aquilina, VP Product and Program Management at Parallels, Chris Marks and the whole team for a well organised meeting. I also want to thank Parallels for including a walking tour of Mdina, the old walled city in the middle of the island. Game of Thrones fans may recognise it: parts of King’s Landing in the first season were filmed there, and its main gate was the city gate of King’s Landing. When you travel somewhere for a meeting, it’s a shame to go home having seen only the hotel and the meeting room.

A breadbox in Malta

Most of the summit was about the future: where Parallels and its products are going next. So there was something nice about the contrast when Freek Berson brought a piece of the past: the newly released Commodore 64 Ultimate. It’s the original C64 hardware, rebuilt exactly, with some modern additions: HDMI output, and loading programs straight from a USB stick instead of a stack of floppies.

And not just to look at. Freek showed a Parallels RAS admin console running on the C64: a client written in BASIC, with a little embedded machine code for the crypto, that talks to a live Parallels RAS environment through a PowerShell gateway. From the C64 you can browse farms and session hosts, see the active sessions and even send a message to a user. The source is on GitHub.

Seeing it took me straight back. I wrote intros back in the day: your logo, shown before a popular game started. I have good memories of the computer meetings, like the monthly one in the Maaspoorthal in ’s-Hertogenbosch, where I live. Let’s be honest, they were copy parties. People brought their own computers and TVs, and in no time you’d see your intro running on screens all over the room.

How intros were made back then

An intro was a few kilobytes of pure 6502 machine code, packed in front of a game. You typed it in a machine code monitor on a cartridge like the Action Replay or the Final Cartridge, or, if you were lucky, in Turbo Assembler on the C64 itself. There was no PC next to it, no emulator, and no debugger beyond the monitor. When it crashed, you reset and started again.

The tricks were all about timing. The C64’s video chip (the VIC-II) draws the screen one line at a time, 50 times per second. If you change a register at exactly the right moment, the screen shows things the hardware was never designed to show:

  • Raster bars: change the background colour on every line
  • More sprites: reuse the 8 hardware sprites further down the screen
  • Into the borders: open the side and top borders and put graphics there
  • Illegal opcodes: use undocumented CPU instructions that saved a cycle or two in exactly the loop where it mattered

It’s been such a long time. I’ve forgotten how to make them. I’ve forgotten most of the 6502 instruction set, never mind the undocumented ones. Weirdly, I still remember lots of SYS and POKE commands:

  • POKE 53280,0 : POKE 53281,0 turns the border and background black
  • SYS 64738 resets the machine
  • SYS 49152 starts the machine code you just loaded at $C000

But Freek really opened a rabbit hole. With the AI and agentic AI tools we have today, could we make an intro like that again?

The VIPP demo

I asked Claude Code, the AI coding agent I use daily, for “a fun c64 demo, perhaps in the old style with a bouncing logo and scroll all VIPP members”, with one condition: it had to run on the real hardware, so the real limits apply. I sent along the VIPP logo and a screenshot of an old demo for inspiration.

It set up a complete toolchain itself:

  • 64tass, a 6502 assembler
  • VICE, a cycle-exact C64 emulator, which it also scripted as a test instrument
  • Python, which generated every graphic
  • Exomizer, which packs the result into a single file. It had to compile Exomizer from source, because there are no Windows builds any more.

About ten minutes later the first version was running: the VIPP logo as sprites, a scroller and music.

The VIPP logo, the 10 and the gold scroller

Over the next few hours we built it up to this:

  • The logo: VIPP, shaded by hand in pixel-art style, bouncing on a sine and gravity curve
  • The “10”: a separate logo for the 10-year anniversary, bouncing on its own path
  • The scroller: an Ocean-style gold font greeting all VIPP members, over Rob Hubbard’s Commando
  • The attack: when the “10” bumps into VIPP, both freeze, a laser gun slides in and shoots the “10” three times, and it explodes in fire. That one was a request: Leee Jeffries asked for lasers and explosions
  • The reflection: the scroller is mirrored in rippling water underneath
The bump, the gun, three shots and the explosion

The hardware still says no

The fun part was watching the AI run into the same walls we did in the eighties, and get around them the same way.

Eight sprites, and not one more. The VIC-II shows at most 8 sprites on one line. The VIPP logo is 21 sprites (3 rows of 7, reused per row), and the “10” is the eighth. So on every line with the logo there was no sprite left for a gun. The solution became the choreography:

  • When the “10” bumps into the logo, it recoils just far enough to be above or below it.
  • In that free band, the gun borrows one of the logo’s sprites, and gives it back halfway down the screen, before the logo needs it again.
  • The laser beam isn’t a sprite at all. It’s the background colour, switched on and off within the line at exactly the right CPU cycle, so the beam stops exactly at the “10”.

63 cycles per line. A PAL C64 has 63 CPU cycles per screen line. With 8 sprites on that line, about 44 are left. The first version needed 50 now and then, so the logo occasionally broke up. The AI found that by stepping through the emulator frame by frame and measuring on which line and cycle its code ran.

Turn a limit into an effect. Multicolour sprites share two of their colours. While the “10” burns in fire colours, the whole VIPP logo picks them up too, as if the blast lights it. That came out of a hardware limit, not a plan.

How we worked

Some things made this work, and they’d work for any project:

  • Previews first. Early on the AI started changing the logo on its own, and I said “show me first before changing it”. From then on every visual change started as an image with a few options: logo A or B, which font, which explosion. I picked and it built.
  • It didn’t trust its own screenshots. It noticed that emulator screenshots in fast-forward mode skip frames and catch half-drawn screens. So it wrote its own tool: VICE stops once per frame, at a fixed point after the frame is drawn, and saves an exact image. It then checked 50 consecutive frames automatically, and searched frames pixel by pixel for artefacts. That’s how it found a VIC-II bug I’d long forgotten: on newer C64s, every colour change in the visible area leaves a grey dot.
  • It measured instead of eyeballing.
    • It checked the motion with positions dumped from memory, not by looking.
    • It recorded the music as WAV files and compared them with the original player’s: a 98.5% match. That started when its sound effects had made the demo completely silent.
    • It checked the laser’s timing on the CPU cycle, over hundreds of frames.
  • It said what it couldn’t check. It can’t listen. “I haven’t heard the result myself” came up more than once, and that’s where I came in.
The water reflection under the scroller

A real TV and a real CRT

When it ran on the real C64, I noticed how good the graphics look over HDMI: razor sharp. Almost too sharp, because I remember them differently. An old CRT TV showed C64 graphics much smoother and less blocky, and artists designed for that:

  • The signal blurred. Most of us connected through the RF or composite input. That smeared each pixel a little into its neighbours, and colours bled into each other horizontally. Pixel edges softened, and the “staircases” on slanted lines largely disappeared.
  • Dithering became colours. With only 16 colours, artists placed two colours in a checkerboard. On a CRT those blended into a new, in-between shade. On HDMI you see the checkerboard. Our water reflection does exactly that: on a TV it would melt into a dark purple.
  • Wide pixels and scanlines. Multicolour mode uses pixels twice as wide. On a CRT, the glowing phosphor and the dark gaps between scanlines made them look rounder and less like blocks.

So the art was made for the screen of the time. HDMI shows what’s really in memory, pixel for pixel.

The full VIPP demo, with sound

Impossible Mission

Then I thought of Impossible Mission by Epyx. I remember it as state of the art when it came out in 1984, and given the graphics and development tools of the time, I honestly still think it is. Your agent runs, jumps and somersaults through an underground base more smoothly than anything else then. Dennis Caswell, its designer, reportedly took those movements from photos in a library book about athletics.

And the sound was very special. A computer that talked: “Another visitor… Stay a while… STAY FOREVER!” That was a real novelty. The speech came from a company called Electronic Speech Systems. Then there’s the scream when the agent falls into a gap.

So I asked: could we add a mode, under the SPACE bar, that pays tribute to it? A self-playing version, with the agent visiting five rooms where the security terminals show Parallels products: RAS, DaaS, Secure Workspace, Browser Isolation and Desktop.

About VIPP Mission: this is not a game, and not a remake. You can’t play it. It is a short tribute to Impossible Mission (designed by Dennis Caswell, published by Epyx in 1984): a self-playing sequence that runs by itself on a loop. We made it for one private event, the Parallels VIPP Summit, as an homage to one of the best-loved C64 games. It uses graphics, sounds and speech from the original game, taken from our own copy. All rights to Impossible Mission remain with its rights holders. The tribute is not distributed: there is no download, and the original game data is not in our repository.

The start of every loop: the agent waits in the lift, then runs out into the corridor

Reverse engineering a 1984 game, live

This is where it got really interesting. The AI loaded the original into the emulator and read its memory and code. Some things it couldn’t get on its own, though: it can’t play with a joystick in real time. So we split the work:

  • I played. It mapped the cursor keys to the joystick and gave me a checklist: ride the lift, run, somersault, search furniture, get zapped by a robot, use a terminal.
  • It recorded. While I played, its tool logged sprites, positions and the sound chip, and saved snapshots of the whole machine every five seconds.
  • It replayed and measured. With those snapshots it went back to any moment and took exact measurements:
    • the agent’s 28 animation frames, each made of three sprite pieces
    • 5 pixels per step, one step every 3 frames, 76 pixels per somersault
    • the lift hum, which doesn’t just stop but spins down: one voice drops by 3 per frame, the other by 4, one frame later
    • the speed of a fall
  • The rooms came from the game itself. It let the original game build all 32 rooms and read them out, and I picked five.

Every time I watched, I had small corrections:

  • “the elevator humm doesn’t stop when the elevator stops”
  • “we’re missing the opening tune”
  • “it doesn’t die when hitting robot or beam from the robot?”
  • “the node map is not drawn when the elevator moves”
  • “is the death scream also in?”

Each one led to a measurement in the original and an exact rebuild.

The lift ride, with the map on the pocket computer

The talking computer, again

The speech is the original engine with its 6 KB of samples. It plays by switching the C64’s master volume very fast. That trick depends on a quirk of the original 6581 sound chip; on the newer 8580 it’s about six times quieter. The AI measured that with WAV recordings. It then added a check that detects which chip is present, and on an 8580 it uses the “digi boost” trick from the eighties. It also told me straight that this only gets it to about half the level, and that I’d better set the Ultimate to a 6581.

Room 23: the robot fires, a somersault, the search finds 'VIPP 10', the terminal

Security terminal 01: Parallels RAS, access granted

When the agent kept dying

I’d asked for exactly one death per loop. At one point I mentioned, almost in passing: “fyi it’s in the dying loop now”. The agent came back at the door, repeated what had killed him, and died again, forever.

The fix was the cleverest part of the project. The AI wrote a simulator of its own game engine that runs every tick of a loop. It plans the agent’s route against that simulation: when to run, when to somersault over a robot, how long to search. The build now fails if a loop has any death that wasn’t planned. VICE then confirmed the simulation “to the tick”. In the end there are two deaths per loop, both planned: a robot’s zap, and a fall with the original scream.

Zapped by a robot

The fall

A bug we only saw while making this blog

For this post we recorded the demo as video: every frame, with sound. The demo was spot on. The mission video came out 2.5 seconds shorter than its audio.

It turns out the mission blocks its frame interrupt for up to 7 frames each time it draws a new scene, 121 frames per loop. Nobody had noticed in two weeks, because those frames are scene changes. Only putting the sound next to the picture showed it: sound is a clock that doesn’t skip.

The fix was in the spirit of the project. The demo already uses one of the C64’s timers, ticking once per screen line, for the laser. The recorder now uses a second, free timer to count those ticks, so every frame knows how much time really passed.

The whole thing

One full VIPP Mission loop, with sound

In numbers:

  • about a day of work, with a night’s sleep in between
  • 8 versions
  • about 5,000 lines of 6502 assembly and 4,600 lines of Python tooling
  • the full 64 KB used, including the RAM hidden under the I/O chips
  • packed into one 25 KB file

Curse you, Freek

What I take away from this: I was the director, the ears and the joystick. The AI wrote the 6502, the tools and the tests, and it was honest about what it couldn’t check. All the tricks I’d forgotten were back within a day, plus a few I never managed back then.

So I curse Freek. I can’t wait to dig up the Commodore 64s I still have, and finally make the stuff I always wanted to make back then but never could.

Music: Commando by Rob Hubbard. Impossible Mission (Epyx, 1984): graphics, sounds, speech and rooms from the original game, for a private event.

A note on how this post was written: I used AI assistance. Claude helped with the project and made the first draft from my notes. It was not written automatically: I steered the work, reviewed the draft, corrected what was wrong and rewrote parts in my own words.