How much of MYST can you run on a
I was doing some Atari programming and thought I’d try out Myst.
It’s nowhere near a complete game, for that check out my
Apple II demake version
The goal is to complete enough to do a speedrun (you can beat original
Myst very quickly only visiting a tiny part of the game if you already
know all the answers). I’ll add a few of the puzzles to make it
a “real” game.
Currently you can walk around a decent amount of Myst island.
You can flip the marker switches.
You can look at the brother’s books.
You can go to D’ni and lose the game (white page isn’t implemented yet).
This product contains trademarks and/or copyrighted works of Cyan.
All rights reserved by Cyan.
This product is not official and is not endorsed by Cyan.
Here’s a video of the gameplay for version 1.2:
A bit of a writeup can be read here
A bit of rambling on the graphics capabilities:
The game engine uses ZX02 compression for each scene.
Each scene’s graphcis are limited (due to various hardware limitations)
to 256 compressed bytes, which means I sometimes have
to simplify the graphics to fit. Each scene has an asymmetric playfield.
Graphics are 40×48 to simplify things a bit. Each line can be two colors,
foreground and background. We fix the background to a single color.
The foreground color can change each 4-line block. I use sprite1 as an
8-block wide source of additional color, so one extra color per line
but only in an 8-block wide column of the screen.
You also get an optional one-block wide vertical line
(missile0) which is the same color as the pointer. The engine
allows the right-side of the screen to alternate background color
every-other-line though it’s unclear if this is useful or not.
When uncompressed the graphics are 448 bytes
which are temporarily stored in the 2k RAM supplied by the E7 cartridge
(by default a 2600 only has 128 bytes of RAM).
Note: these were captured with the Stella emulator.
If you want to see screenshots from the original 4k proof of concept
you can find them here
- An NTSC Atari 2600
- Here is the ROM image for v1.8 (22 June 2023)
- You can find it in the full git repository here:
You’ll need cc65 to build it.
How to Play
- The best way of course is on an actual Atari 2600
- You can download the images above and run in an emulator like Stella or MAME
- You can in theory play it in
on Javatari (note, until recently there was a bug in Javatari’s
E7 cartridge emulation. I’ve contributed a fix but not sure how
long it will take to get merged)
- Finally you can also
possibly play in your browser at the internet archive.
- Q. Why?
- Q. The graphics look pretty bad.
A. It takes a lot of work to make nice graphics. Each scene
is more or less a procedurally generated demo.
By default you only have a 20-bit (yes, bit) framebuffer,
and you can only draw one line a time, with only two
colors in it. Anything more than that is someone
being really really clever in 6502 assembly language.
- Q. Are you going to do the whole game?.
A. No. Even though you can get fancy bank-switch cartridges
these days I prefer to work within the limitations of
the time. Also to do the full game requires at least
800 scenes, which would be roughly 200k, which would
be both a pretty hefty cartridge as well as a lot
of graphics to draw.
- Q. How did you learn how to make Atari 2600 games in
less than a month?
A. A lot of skills I have from my Apple II hobby directly transfer.
6502 assembly, 6502 size-coding, 40×48 lo-res block graphics,
beam-racing demos. Doing beam racing is actually much
easier on the 2600 than on the Apple II due to the WSYNC
- Q. How do you make the graphics?
A. I run the original game under SCUMMVM. I take a screenshot
and load it into GIMP. I crop it, raise the brighness
a bit, then size to 40×48.
I then remap to the Atari 2600 palette (no dithering).
I expand to 80×48 for editing. I then draw over by hand.
The biggest challenge is picking what color to be the
background color. It’s often black or dark grey.
When done I manually split things up into two images,
background and overlay. I then have tools that convert
these PNG files into data that can be loaded into the
assembly language of the game.
22 June 2023 — Release v1.8
It’s Mysterium time again so working on things again. Added two new
locations. Also tracked down the bug in E7 cartridge handling in
Javatari that was making things crash. It wasn’t properly turning off RAM
when we switch ROM back in. I’ve contributed a fix upstream, we’ll see
if it gets fixed.
23 December 2022 — Release v1.7
Finally had some time to work on things again. Finally got glitch-free
(multi-frame) decompression to work, at least on Stella.
So can maybe now work on features again.
1 October 2022
Work has stalled a bit, partly because the semester has started, but
also due to being stuck on some complex code. Curently the graphics
are compressed, and decompressing them takes 3 or so frames. While this
looks fine on the stella emulator, if you go 3 frames without SYNCing the
display you’ll get annoying glitches on real hardware (or at least you
do on the NTSC capture cards I have). So I’ve been working on having
the decompression happen in parts with proper sync happening and it’s
proving to be a bit difficult.
31 August 2022— Release v1.6
Spent a lot of time tracking down some issues with my E7 bank switching.
Should work on mame and harmony cart again.
30 August 2022— Release v1.5
You can move around D’ni now and bug Atrus. Trying to figure how much
room I’ll have to implement some puzzles.
28 August 2022— Release v1.4
Got sidetracked on a side project.
Anyway you can make it to D’ni now, although none of the puzzles
or pages are hooked up properly.
16 August 2022— Release v1.3
You can now reach all 8 marker switches.
12 August 2022— Release v1.2
Now you can get to (and activate)
three of the marker switches, plus you can investigate
the red/blue books in the library. This involved making the book-drawing
code generic which was a bit of a pain.
I’d estimate the cartridge is about half full now.
10 August 2022
Now up to 18 different locations you can visit. Need to start adding back
the code that lets you grab objects.
5 August 2022— Release v1.1
Everyone wants to see more levels, so I’m learning how to use an E7-style
bank switch cartridge (16k ROM / 2k RAM). I’m hoping I can put a decent
amount of Myst island on it. The kernel/engine I have takes 448 bytes
for each screen, but I am using ZX02 compression to fit a lot more in
(though it’s tricky decompressing to the RAM). The compressed data
has to fit in 256 bytes per level, which can be tricky for complex levels.
I’ve got the 4k version more or less transferred over (though I had to
simplify some of the levels) and you can very barely walk about now.
It should be more interested as I find time to add new levels.
29 July 2022— Release v1.0
Powered through and did a 1.0 release. As always there are probably
more important things I should be working on, but it’s hard to
not work on things until I get at least one release out the door.
Most of the work was adding animation to the cleft and book scenes,
optimizing size down, trying to approximate the linking noise,
and work on the arrival screen. Not entirely happy with how
the arrival screen turned out but was running low on ROM so
some compromises were made.
28 July 2022
Finished the clock scene. Redid a lot of the design as I’ve
learned more about how the VCS works. Also put together the rocket
graphics. Trying to have a 2-scanline kernel if possible but keep
rolling over to 4-scanline as I run out of cycles.
27 July 2022
Got the linking book in decent shape. Feel like I’ve been decently
clever with it.
26 July 2022
Working on the star cleft. Wasted a lot of time trying to make nice
looking stars, really should look up how games like Solaris do it.
Was trying to have an HMOVE of 7 and then skipping 8 scanlines
so things were relatively prime, but didn’t really work out that well.
24 July 2022
Got secret collect more or less finished so back to working on Myst.
It was too ambitious a project to start with, things are going a bit
easier now that I’ve learned some things.